Existe-t-il un moyen de dire sed
de remplacer le modèle à chaque seconde occurrence? Ou au moins sur une ligne sur deux? (Bien sûr, c'est possible avec un script, mais je me demandais si je pouvais le sed
faire).
Éditer
j'ai trouvé
sed -e "s/pattern/replacement/g;n"
Mais il a remplacé chaque première occurrence, pas la seconde.
Exemple
Fichier d'entrée:
I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern
Sortie désirée:
I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement
sed -e 'n;s/2004-2009/6e législature/g'
résoudre mon problème.Remplacera la deuxième occurrence sur chaque ligne qui a le motif.
si vous avez GNU
sed
:À partir de la première ligne
1
, la ligne qui suit sera ajoutée à l'espace de motif,N
puis las
commande remplacera la deuxième occurrence du motif. puissed
déplacera deux lignes vers le bas~2
et répétera.la source
code
(sed '1 ~ 2s / motif / remplacement /')L'interprétation simple:
Sur la première ligne qui contient au moins une occurrence de PATTERN, vous souhaitez l'ignorer et imprimer la ligne telle quelle. Sur la deuxième ligne qui contient au moins une occurrence de PATTERN, vous souhaitez remplacer la première instance de PATTERN par REPLACEMENT. Sur la troisième ligne qui contient au moins une occurrence de MOTIF, vous souhaitez imprimer la ligne telle quelle. Sur la quatrième ligne qui contient au moins une occurrence de PATTERN, vous souhaitez remplacer la première instance de PATTERN par REPLACEMENT. Etc. Les lignes qui ne correspondent pas au MOTIF doivent être imprimées sans modification.
Cela peut être facilement fait avec Sed comme ceci:
Ou, avec moins d'espaces et une étiquette plus courte:
EDIT: Je viens de relire la question et repéré l'interprétation plus difficile:
Remplacez la deuxième occurrence de MOTIF dans tout le document par REMPLACEMENT, qu'elle se produise sur la même ligne que la première occurrence ou non. Laissez les première et troisième occurrences inchangées. Etc.
Je pense que cela peut aussi être fait avec Sed, bien que ce soit BEAUCOUP plus compliqué et je crois que cela dépend de l'expression régulière à utiliser. Je vais essayer de travailler sur quelque chose et de le poster, mais je vais laisser cette réponse avec la version simple ci-dessus pour l'instant.
la source
t
est par unq
uit et prenez une entrée comme,{ sed '...'; cat; } <input
pour un seul remplacementVous étiez très proche, sautez simplement la première ligne:
Pourquoi devrait
awk
être le meilleur outil dans ce cas?la source
Un modèle de symbole sur une seule ligne: sed 's / (a [^ a] *) a / \ 1c / g'
Chaque deuxième motif (une seule correspondance de motif par ligne peut apparaître. Si deux correspondances ou plus par ligne apparaissent, seul le second sera remplacé)
la source