remplacer la nième occurrence de chaîne dans chaque ligne d'un fichier texte

15

J'ai de gros fichiers texte avec des chaînes délimitées par des espaces (2-5). Les chaînes peuvent contenir "'" ou "-". Je voudrais remplacer disons le deuxième espace par un tuyau.

Quelle est la meilleure façon de procéder?

En utilisant sed, je pensais à ceci:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

D'autres idées / meilleures / plus simples?

dnkb
la source

Réponses:

22

Vous pouvez ajouter un nombre à la fin de la commande de substitution. Par exemple, ce qui suit remplacera la deuxième occurrence de oldpar la chaîne newsur chaque ligne de file:

sed 's/old/new/2' file

Ainsi, au lieu de votre solution proposée, vous pouvez utiliser:

sed 's/ /|/2'

Pour plus d'informations, voir par exemple ce tutoriel sed .

mrucci
la source
2
A partir du sedfichier info: "Remarque: la norme POSIX ne spécifie pas ce qui doit se produire lorsque vous mélangez les g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across implémentations sed. Pour GNU" sed ", l'interaction est définie comme: ignorer les correspondances avant le NUMBERth, puis correspondre et remplacer toutes les correspond à partir du NUMBERe. "
pause jusqu'à nouvel ordre.
Fichiers d'informations ... je les déteste. Quoi qu'il en soit, j'ai supprimé la partie ambiguë. Bon commentaire, +1.
mrucci
1
Merci, mrucci et Dennis. Je pensais qu'il devait y avoir quelque chose de simple là-bas.
dnkb
Il semble que chaque problème que j'ai avec la manipulation de texte, j'arrive à le résoudre sed. Je ne suis pas sûr que je devrais vous remercier de m'avoir rendu sedencore plus utile, mais je le ferai quand même. ;)
Jamie
1

Avez-vous essayé votre version? Cela a-t-il fonctionné? Parce que je pense que c'est fondamentalement une bonne idée. Je ferais un peu différemment, cependant:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

Cela acceptera tous les caractères d'un mot qui n'est pas un espace et acceptera plus d'un espace entre les deux premiers mots.

petersohn
la source