9 votes

Effectuer une capture regex puis remplacer en utilisant SED/PERL

J'ai des données qui ressemblent à ceci (appelons ce fichier submit.txt) :

dir1/pmid_5409464.txt
dir1/pmid_5788247.txt
dir1/pmid_4971884.txt

Ce que je veux faire est d'effectuer un changement de regex de fichier en ligne afin d'obtenir ce qui suit :

perl mycode.pl /home/neversaint/dir1/pmid_5409464.txt > /home/neversaint/dir1/pmid_5409464.output
perl mycode.pl/home/neversaint/dir1/pmid_5788247.txt > /home/neversaint/dir1/pmid_5788247.output
perl mycode.pl /home/neversaint/dir1/pmid_4971884.txt > /home/neversaint/dir1/pmid_4971884.output

Y a-t-il une ligne de commande SED/Perl pour le faire ?

Ma difficulté réside dans la capture du nom du fichier d'entrée et ensuite créer le fichier de sortie (.output) - pour chaque ligne - en fonction de cela. Je suis bloqué avec ceci :

sed 's/^/perl mycode.pl \/home\/neversaint\/dir1\//g' submit.txt |
sed 's/$/ >/'

15voto

chilemagic Points 2727

Vous pouvez utiliser des parenthèses échappées pour capturer des groupes et accéder aux groupes avec \1, \2, etc.

sed 's/^\(.*\).txt$/perl mycode.pl \/home\/neversaint\/\1\.txt > \/home\/neversaint\/\1.output/' submit.sh

sortie:

perl mycode.pl /home/neversaint/dir1/pmid_5409464.txt > /home/neversaint/dir1/pmid_5409464.output
perl mycode.pl /home/neversaint/dir1/pmid_5788247.txt > /home/neversaint/dir1/pmid_5788247.output
perl mycode.pl /home/neversaint/dir1/pmid_4971884.txt > /home/neversaint/dir1/pmid_4971884.output

modifier : il semble que sed n'ait pas d'option intégrée pour l'édition de fichiers sur place (GNU sed a l'option -i). C'est toujours possible à faire mais cette solution imprime simplement sur la sortie standard. Vous pourriez également utiliser une commande Perl en une ligne comme montré ici: sed edit file in place

1voto

AlienHoboken Points 2265

Vous avez demandé une solution Sed en une ligne, la voici.

sed 's/\([^.]*\)\.txt/perl mycode.pl \/home\/neversaint\/\1.txt > \/home\/neversaint\/\1.output/' submit.txt > output.txt

1voto

Ramg Points 140

Le perl oneliner pour faire la même chose est

perl -pe "s@(.*?)(\.txt)@perl mycode.pl /home/neversaint/\\1\\2 > /home/neversaint/\\1.output@g" submit.txt

La commande ci-dessus produira une chaîne remplacée dans la console et vous devrez rediriger la sortie vers un autre fichier.

Pour remplacer à l'intérieur du fichier (remplacement en ligne), vous pouvez ajouter l'option -i. Par exemple

perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt

Le code ci-dessus effectuera un remplacement à l'intérieur du fichier submit.txt lui-même.

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