¿Cómo puedo reemplazar el texto después de una palabra específica usando sed?

12

Tengo un archivo llamado .ignore. En necesidad de reemplazar el projdir. Por ejemplo:

ignore \..*
ignore README
projdir Snake

Necesito reemplazar Snake con, por ejemplo, "PacMan". Leí la página del manual, pero no tengo idea de qué hacer.

Jakub Baski Gabčo
fuente

Respuestas:

18

Busque una línea que comience projdiry reemplace toda la línea por una nueva:

sed -i 's/^projdir .*$/projdir PacMan/' .ignore

^y $son marcadores de inicio / fin de línea, por lo que el patrón coincidirá con toda la línea; .*coincide con cualquier cosa. El -ile dice seda escribir los cambios directamente .ignore, en lugar de simplemente enviarlos

Michael Mrozek
fuente
5

Un enfoque es reescribir toda la línea, utilizando referencias posteriores para las partes que desea conservar:

sed -e 's/^\( *projdir  *\)[^ ]*\(.*\)*$/\1PacMan\2/'

Otro enfoque es reescribir esa parte de la línea, pero solo si alguna otra parte coincide:

sed -e '/^ *projdir / s/ [^# ]/ PacMan/'

Ambos ejemplos reescriben la segunda palabra delimitada por espacios en blanco en las líneas donde está la primera palabra projdir.

Gilles 'SO- deja de ser malvado'
fuente
3

Aunque esta es una publicación antigua y parece que la respuesta aceptada la resuelve, la pregunta real no ha sido respondida. Entonces, para completar y ayudar a otros:

Aquí la respuesta que realmente coincide con "Snake" y no con las líneas que comienzan con "projdir" ...

sed -r 's/(^.*)Snake/\1PacMan' .ignore

Esto reemplaza todo desde el comienzo de la línea, incluyendo "Snake" con todo antes de "Snake" + "PacMan". \ 1 representa lo que coincide dentro (). Todo lo que sigue a "Serpiente" permanece intacto.

Moritz
fuente
1
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore

^ projdir es encontrar la línea que comienza con string projdir. El. * $ Allí representa la cadena después de projdir en la línea de la misma línea. El string projdir PacMan es el string con el que estamos reemplazando. g es para global: para reemplazar todas esas líneas que comienzan con projdir. .ignore es el nombre del archivo

Tinu
fuente
1
¿Puede por favor extender su respuesta y aclarar qué es qué?
Romeo Ninov
Las respuestas son mucho más útiles si incluyen explicaciones de cómo y por qué funciona un comando o código.
Anthony Geoghegan
Espero que esto sea más útil después de editar
Tinu