4 votes

Comment effectuer une substitution de texte dans tous les fichiers d'un dossier ?

Je dois mettre à jour un seul paramètre dans un grand ensemble de fichiers .xml. J'ai lu un peu partout et en utilisant une seule ligne de perl à la ligne de commande de Windows, j'arrive à faire des substitutions un fichier à la fois, mais j'ai du mal à faire en sorte que perl fasse tous les fichiers en même temps.

perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" test.xml

Cela fonctionne, mais lorsque j'essaie de le changer en quelque chose comme

perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" *.xml

J'obtiens "Can't open *.xml : Invalid argument".

perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" .xml

Donne "Can't open .xml : No such file or directory"

J'ai essayé de voir si je pouvais l'appeler à partir d'un autre script perl en utilisant system(), mais cela semble poser problème avec l'utilisation des guillemets, et ce n'est peut-être pas la meilleure façon de le faire.

Résumé :

Problème - J'ai un grand nombre de fichiers .xml dans lesquels je veux modifier un seul paramètre. Je dois être en mesure de le faire sur une machine Windows et, idéalement, je voudrais travailler vers une solution qui me permettrait d'automatiser cela dans un script afin que je puisse boucler sur de nombreuses substitutions de valeurs de paramètres (avec un appel à un programme séparé qui prend les fichiers .xml comme entrée entre les substitutions).

Merci pour toute aide que vous pourrez m'apporter.

3voto

Tim Henigan Points 19948

Lorsque je fais ce genre de choses, j'utilise généralement le schéma suivant :

ls *.xml | xargs perl -i.bak -p -e "s/<search>/<replace>/g"

Sous Windows, vous devriez pouvoir utiliser le modèle suivant :

for %f in (*.xml) do perl -i.bak -p -e "s/<search>/<replace>/g" "%f"

Voir Perl 5 par exemple : Utilisation des options -n et -p pour plus de détails.

3voto

Mat Points 104488

Vous pouvez utiliser un for dans une boucle .cmd script. Quelque chose comme :

for %%a in (*.xml) do (
  perl -i.bak ... %%a
)

Voici un guide pratique cmd.exe référence .

3voto

dsolimano Points 5065

Essayez ça :

for /r %i in (*.xml) do perl -pi.bak -e "s/( \d +. \d +E- \d +)/2.2E-6/g ;" %i

1voto

Dallaylaen Points 3877

use File::Find;

MISE À JOUR : vous pouvez utiliser cette phrase unique :

perl -we 'use File::Find; my $dir = shift; find (sub { $_=~ /\.xml$/i and system @ARGV, $_ }, $dir)' <dir> <other-one-liner>

1voto

tadmc Points 3326

Le problème est que l'excuse de Windows pour un shell ne fait pas de globbing de nom de fichier (expansion de *.xml dans tous les fichiers avec une extension .xml).

Puisque l'obus ne le fait pas pour vous, vous devez le faire vous-même.

C'est facile à faire en Perl, mais cela doit être fait avant que le code "interne" ne commence, donc mettez-le dans un bloc BEGIN :

perl -pi.bak -e "BEGIN{@ARGV=glob shift} s/(\d+\.\d+E-\d+)/2.2E-6/g;" *.xml

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X