sed - applique les modifications dans plusieurs fichiers


11

J'ai des centaines de fichiers contenant " </foo:bar>"

cc
bb
aa
</foo:bar>
dd
xx
vv

Je veux les changer tous en même temps pour

cc
bb
aa
</foo:bar>

sed fonctionne bien quand je lui donne le nom de fichier exact

sed -i "/ </ foo: bar> / q" 99999.txt

mais quand j'essaye de les changer tous en même temps, je n'obtiens aucun résultat.

 sed -i "/<\/foo:bar>/q" *.txt

Réponses:


19

Essayer:

sed -s -n -i '0,/<\/foo:bar>/p' *.txt

-s indique à sed de traiter chaque fichier séparément.

Parce que nous ne voulons sedpas quitter tant que tous les fichiers ne sont pas terminés, nous passons à l'impression du début <\/foo:bar>et non à l'impression du reste des lignes. -nindique à sed de ne pas imprimer à moins que nous ne le lui demandions explicitement. La commande 0,/<\/foo:bar>/pindique à sed d'imprimer n'importe quelle ligne de la plage depuis le début du fichier jusqu'à la première ligne correspondante <\/foo:bar>.

L' -soption n'est pas disponible pour BSD / OSX sed.


@ fd0 Merci. Réponse mise à jour pour noter l'absence de -sBSD / OSX sed.
John1024

pour GNU sed , l' -ioption implique -s... y a-t-il une sedimplémentation où cette solution ne fonctionnera pas sans -soption?
Sundeep

7

Pour arrêter la lecture des fichiers une fois </foo:bar>trouvé:

Avec GNU awk:

gawk -i inplace '{print}; $0 == "</foo:bar>" {nextfile}' ./*.txt

Avec perl:

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.