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?

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 .


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.