Utiliser sed BSD;
Comment puis-je effectuer la substitution suivante ? :
Avant :
hello hello hello
hello hello hello Après :
hello world hello
hello hello hello
En d'autres termes; comment puis-je remplacer uniquement le N ème occurrence d'un motif ?
(Ou dans ce cas ; le 2 et occurrence d'un motif ?)
Réponse acceptée :
Avec n'importe quel sed POSIX :
$ sed -e'/hello/{' -e:1 -e'$!N;s/hello/world/2;t2' -eb1 -e\} -e:2 -en\;b2 <file
hello world hello
hello hello hello
-
Après la première correspondance
/hello/, nous courons dans une boucle. -
Boucle intérieure
:1, on lit chaqueNligne externe à l'espace de motif, en faisantscommande de remplacement pour2e occurrence seulement. Noustest si la substitution réussit ou non. Si oui, nous rencontrons la boucle:2, sinon répéter la boucle avecb1. -
Boucle intérieure
:2, nous imprimons simplement les lignes restantes jusqu'à la fin du fichier.
Notez que cette approche stockera toutes les choses entre deux hello dans l'espace du motif. Ce sera un problème avec des fichiers volumineux, lorsque le premier et le second sont éloignés l'un de l'autre.