reemplazar enésima aparición de cadena en cada línea de un archivo de texto

15

Tengo archivos de texto grandes con cadenas delimitadas por espacios (2-5). Las cadenas pueden contener "'" o "-". Me gustaría reemplazar, digamos, el segundo espacio con una tubería.

¿Cuál es el mejor camino a seguir?

Usando sed estaba pensando en esto:

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

¿Alguna otra idea / mejor / más simple?

dnkb
fuente

Respuestas:

22

Puede agregar un número al final del comando sustituto. Por ejemplo, lo siguiente sustituirá la segunda aparición de oldcon la cadena newen cada línea de file:

sed 's/old/new/2' file

Entonces, en lugar de su solución propuesta, puede usar:

sed 's/ /|/2'

Para obtener más información, consulte, por ejemplo, este tutorial de sed .

mrucci
fuente
2
Desde el sedarchivo de información: "Nota: el estándar POSIX no especifica qué debe suceder cuando se mezclan las g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across implementaciones de sed. Para GNU 'sed', la interacción se define como: ignorar coincidencias antes del NÚMERO, y luego emparejar y reemplazar todos coincidencias a partir del NUMBERth ".
Pausado hasta nuevo aviso.
Archivos de información ... los odio. De todos modos, eliminé la parte ambigua. Buen comentario, +1.
mrucci
1
Gracias, mrucci y Dennis. Pensé que debe haber algo simple por ahí.
dnkb
Parece que cada problema que tengo con la manipulación de texto, consigo resolverlo sed. No estoy seguro de que deba agradecerte por sedhacerme aún más útil, pero lo haré de todos modos. ;)
Jamie
1

¿Probaste tu versión? ¿Funcionó? Porque creo que es básicamente una buena idea. Sin embargo, haría un poco diferente:

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

Esto aceptará cualquier carácter en una palabra que no sea espacio, y aceptará más de un espacio entre las dos primeras palabras.

Petersohn
fuente