Rechercher des expressions rationnelles et remplacer des exemples de scripts

By | août 9, 2019

Python pas cher

La recherche et le remplacement sont une tâche si courante qu’il devrait s'agir d’un outil qui se trouve dans la boîte à outils de chaque auteur de script de ligne de commande.
Il y a probablement des solutions sans fin au problème.
J'ai mis au point mes méthodes standard pour résoudre le problème.
Je vais également montrer des versions similaires de Perl, principalement à des fins de comparaison.

utiliser des modèles

Dans la majeure partie de la discussion suivante, je remplace simplement "foo" par "bar".
Cependant, "foo" peut être N'IMPORTE QUELLE expression régulière

La situation fictive que je vais créer est la suivante.
J’ai un fichier nommé ‘example.txt’.
Cela ressemble à ceci:

Je réalise que je veux remplacer "foo" par "bar".

J'aimerais pouvoir disposer d'un script qui s'exécute de telle sorte que je puisse diriger le contenu du fichier dans le script ou simplement lui attribuer un nom, comme suit:

  • cat exemple.txt | python search_replace.py
  • python search_replace.py example.txt

Maintenant, je peux ou non souhaiter que le script modifie le fichier en place.
Sinon, le deuxième exemple ci-dessus ne ferait qu'imprimer le contenu modifié.
Je voudrais aussi peut-être faire une sauvegarde de example.txt en premier.
Nous pouvons toutes ces choses, comme je vais le montrer ci-dessous.

en utilisant Python

Rechercher et remplacer en tant que filtre

Je pense que la forme la plus élémentaire d’un script de recherche / remplacement en python ressemble à ceci:

Le module fileinput prend en charge le flux vers la gestion des entrées de nom de fichier.
Le module re (regex, expression régulière) a un sous qui gère la recherche / remplacement.
Le «rentrée» est appelé sur l’entrée juste pour effacer la ligne de sa nouvelle ligne, car la prochaine instruction «print» va ajouter une nouvelle ligne par défaut.

Cela gère le cas où nous ne voulons pas modifier le fichier.

Modification en place des fichiers

Un script légèrement modifié vous permettra de modifier des fichiers et éventuellement de copier le fichier d'origine sur une sauvegarde.

Si vous laissez le drapeau "backup" éteint, aucune sauvegarde ne sera effectuée.
Comme je l’ai montré avec backup = ’. Bak’, un fichier example.txt.bak sera créé.

avec une expression régulière plus complexe

Bien sûr, foo et bar ne doivent pas être aussi simples.
Par exemple, le problème que j'ai avec la conversion d'une table des matières en une série de balises h2 peut être résolu avec le script suivant.

Ici, je cherche des choses qui ressemblent à

et en le remplaçant par

en utilisant Perl

Comme je l’ai déjà mentionné, j’utilise encore parfois Perl, même si j’aime utiliser Python pour la plupart de mes besoins de script.

Par conséquent, je présente les versions de Perl que j’avais utilisées auparavant, principalement à titre de comparaison.

Il y a beaucoup de façons d'implémenter cela en Perl.

tout en ligne de commande

Ce qui suit sont à peu près équivalents:

  • cat exemple.txt | perl -pe 's / foo / bar / g;'
  • cat exemple.txt | perl -ne 's / foo / bar / g; print'
  • cat exemple.txt | perl -e 'while () s / toto / bar / g; print;'
  • cat exemple.txt | perl -e 'while () $ _ = ~ s / toto / bar / g; print;'
  • perl -pe 's / foo / bar / g;' exemple.txt
  • perl -ne 's / foo / bar / g; print' exemple.txt
  • perl -e 'while () s / toto / bar / g; print;' exemple.txt
  • perl -e 'while () $ _ = ~ s / toto / bar / g; print $ _;' exemple.txt

drapeaux utilisés

  • -e: exécute le code sur la ligne de commande
  • -n: tout envelopper dans tandis que () [code here]
  • -p: tout envelopper tandis que () [code here]; impression;

Comme un script

Et bien sûr, vous n’avez pas à utiliser le drapeau "-e".
Vous pouvez coller le script dans un fichier.

Les scripts suivants sont équivalents:

Changer les fichiers en place

Perl permet également de modifier les fichiers en place, avec l’ajout du drapeau «-i», généralement utilisé en tant que «-i.bak» pour créer des copies de sauvegarde de l’original:

[ad_2]