GNU/Linux >> Tutoriels Linux >  >> Linux

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

Cette question a déjà des réponses ici :sed :supprime toutes les occurrences d'une chaîne sauf la première

(4 réponses)
Fermé il y a 2 ans.

J'ai un fichier contenant des lignes :

india;austria;japan;chile
china;US;nigeria;mexico;russia

Je veux remplacer toutes les occurrences de point-virgule sur chaque ligne par ex. ;NEW; , mais à partir de la 2e occurrence seulement. Le résultat devrait ressembler à ceci :

india;austria;NEW;japan;NEW;chile
china;US;NEW;nigeria;NEW;mexico;NEW;russia

J'ai essayé ceci avec gsub, mais cela remplace toutes les occurrences :
awk '/;/{gsub(/;/,";NEW;") }{print}'

Réponse acceptée :

Le awk solution est beaucoup plus longue, mais il est plus simple de la rendre générique :

awk -F; '{for(i=1;i<NF;i++)printf"%s;%s",$i,(i>=2)?"NEW;":"";print$NF}' replacefile

Est-il possible de le faire avec sed aussi, en faisant une boucle avec le t commande et en remplaçant toujours le 2ème séparateur (ou celui que vous voulez) par une marque temporaire (généralement n ):

sed ':b;s/;/n/2;tb;s/n/;NEW;/g' replacefile

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

  2. Correspondance de modèle multiligne à l'aide de Sed, Awk ou Grep ?

  3. Imprimer la ligne précédente après une correspondance de modèle à l'aide de Sed ?

  4. Trouver le numéro de ligne qui contient le modèle à l'aide du délimiteur Regex personnalisé ?

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

Remplacement de chaîne dans Bash

Sed :Insérer le texte après le nième caractère précédant/suivant une chaîne donnée ?

sed - insérer une ligne après X lignes après la correspondance

Afficher la correspondance trouvée ou non en utilisant awk

sed :comment remplacer la ligne si elle est trouvée ou ajouter à la fin du fichier si elle n'est pas trouvée ?

Comment obtenir la n-ième ligne après une grep?