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:
foo foo fiddle foo
et baz aussi, ainsi que foo
foo foo violon foo et baz aussi, comme bien comme foo |
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:
importer un fichier
import re
pour la ligne dans fileinput.input ():
line = re.sub ('foo', 'bar', line.rstrip ())
imprimer (ligne)
importation entrée de fichier importation ré pour ligne dans entrée de fichier.contribution(): ligne = ré.sous('foo','bar', ligne.bande de retour()) impression(ligne) |
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.
importer un fichier
import re
pour la ligne dans fileinput.input (inplace = 1, backup = '. bak'):
line = re.sub ('foo', 'bar', line.rstrip ())
imprimer (ligne)
importation entrée de fichier importation ré pour ligne dans entrée de fichier.contribution(en place=1, sauvegarde='.bak'): ligne = ré.sous('foo','bar', ligne.bande de retour()) impression(ligne) |
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.
importer un fichier
import re
pour la ligne dans fileinput.input ():
line = re.sub (r ' * [(.*)] (# (. *) ) ', r'
1
', line.rstrip ())
imprimer (ligne)
importation entrée de fichier importation ré pour ligne dans entrée de fichier.contribution(): ligne = ré.sous(r' * [(.*)](#(.*)) ', r' 1', ligne.bande de retour()) impression(ligne) |
Ici, je cherche des choses qui ressemblent à
* [the label](#l'ancre)
* [[[[le étiquette](#l'ancre) |
et en le remplaçant par
le lien
<h2 identifiant="l'ancre">le lien</h2> |
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:
#! / usr / bin / perl
tandis que (<>)
$ _ = ~ s / toto / bar /;
print $ _;
#! / usr / bin / perl
tandis que (<>)
s / toto / bar /;
impression;
#! / usr / bin / perl -n
s / toto / bar /;
impression;
#! / usr / bin / perl -p
s / toto / bar /;
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 |
#! / usr / bin / perl tandis que (<>) $_ =~ s/foo/bar/; impression $_;
#! / usr / bin / perl tandis que (<>) s/foo/bar/; impression;
#! / usr / bin / perl -n s/foo/bar/; impression; #! / usr / bin / perl -p s/foo/bar/; |
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:
perl -pi.bak -e 's / foo / bar / g;' exemple.txt
perl –pi.bak –e '/ foo / bar / g;' Exemple.SMS |
[ad_2]