Como posso substituir o texto após uma palavra específica usando sed?

12

Eu tenho um arquivo chamado .ignore. Na necessidade de substituir o projdir. Por exemplo:

ignore \..*
ignore README
projdir Snake

Preciso substituir o Snake por, por exemplo, "PacMan". Eu li a página de manual, mas não tenho ideia do que fazer.

Jakub Baski Gabčo
fonte

Respostas:

18

Procure uma linha que comece com projdire substitua a linha inteira por uma nova:

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

^e $são marcadores de início / fim de linha, para que o padrão corresponda à linha inteira; .*corresponde a qualquer coisa. O -idiz sedpara escrever diretamente as alterações .ignore, em vez de apenas produzi-las

Michael Mrozek
fonte
5

Uma abordagem é reescrever a linha inteira, usando referências anteriores para as partes que você deseja manter:

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

Outra abordagem é reescrever essa parte da linha, mas apenas se alguma outra parte corresponder:

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

Ambos os exemplos reescrevem a segunda palavra delimitada por espaços em branco nas linhas em que a primeira palavra está projdir.

Gilles 'SO- parar de ser mau'
fonte
3

Embora este seja um post antigo e pareça ter sido resolvido para você pela resposta aceita, a pergunta real não foi respondida. Portanto, para ser completo e ajudar os outros:

Aqui a resposta que realmente corresponde a "Snake" e não a linhas que começam com "projdir" ...

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

Isso substitui tudo, desde o início da linha, incluindo "Snake" com tudo antes de "Snake" + "PacMan". \ 1 representa o que corresponde a dentro (). Tudo depois de "Snake" permanece intocado.

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

^ projdir é encontrar a linha que começa com a string projdir. O. * $ Ali representa a sequência após projdir na linha da mesma linha. A string projdir PacMan é a string pela qual estamos substituindo. g é global - substitui todas essas linhas começando com projdir. .ignore é o nome do arquivo

Tinu
fonte
1
Você pode estender sua resposta e esclarecer o que é o quê?
Romeo Ninov 27/01
As respostas são muito mais úteis se incluirem explicações sobre como e por que um comando ou parte do código funciona.
Anthony Geoghegan
Espero que este é mais útil após a edição
Tinu