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 chaqueN
ligne externe à l'espace de motif, en faisants
commande de remplacement pour2
e occurrence seulement. Noust
est 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.