GNU/Linux >> Tutoriels Linux >  >> FreeBSD

Freebsd – Bsd Sed :Remplacer uniquement la nième occurrence d'un motif ?

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 chaque N ligne externe à l'espace de motif, en faisant s commande de remplacement pour 2 e occurrence seulement. Nous t est si la substitution réussit ou non. Si oui, nous rencontrons la boucle :2 , sinon répéter la boucle avec b1 .

  • 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.


FreeBSD
  1. Utilisation de Sed pour rechercher et remplacer une ligne entre des plages de motifs

  2. Insérer un fichier dans un autre fichier après la 1ère occurrence d'un motif ?

  3. Remplacer le motif une fois que la nième correspondance est trouvée sur chaque ligne ? ?

  4. Renvoyer uniquement la partie d'une ligne après un motif correspondant ?

  5. Trouver uniquement la première occurrence en utilisant uniquement Grep ?

Top 20 des commandes sed à utiliser

Sed :imprimer uniquement la première occurrence d'une correspondance de modèle ?

Comment trouver la dernière occurrence du motif et imprimer toutes les lignes suivant la dernière occurrence ?

Freebsd - D'où vient Mac Os X ?

Utilisation de sed pour remplacer entre un modèle spécifique

Remplacement SED sur plusieurs lignes