Encontre e substitua por casos de exclusão em sed

0

Estou tentando usar sed para adicionar uma string após um determinado padrão, mas quero excluir o caso em que a string adicional já está presente.

Por exemplo:

"text.txt"

Hello
Bar
Hello world!

Se eu usar sed -i -e 's/Hello/Hello world!' text.txt , a terceira linha se tornará

Hello world! world!

mas gostaria de mantê-lo intacto.

Eu encontrei esta pergunta relacionada mas nem todas as linhas do meu arquivo precisam para ser modificado.

Alguém tem receita para isso?

    
por Jacques Gaudin 02.05.2018 / 12:54

2 respostas

1

A resposta à sua pergunta está escondida em uma das respostas da pergunta relacionada:

/Hello world!/ ! s/Hello/Hello world!/

A primeira parte é um "endereço", ou seja, o seguinte comando aplica-se apenas às linhas correspondentes. O ! nega a condição, ou seja, o comando só será aplicado às linhas não correspondentes ao endereço. Então, em outras palavras, Substitua Hello por Hello world! em linhas que não contenham Hello world! .

    
por 06.06.2018 / 17:24
2

Você pode usar as âncoras explícitas de início e fim de linha ( ^ e $ ):

$ sed -e 's/^Hello$/Hello world!/' <<EOF
> Hello
> Bar
> Hello world!
> EOF
Hello world!
Bar
Hello world!

Isso também pode ser melhorado para legibilidade / brevidade usando Hello , que substitui toda a correspondência ... Desta forma, você não precisa repetir o %code% :

$ sed -e 's/^Hello$/
$ sed -e 's/^Hello$/Hello world!/' <<EOF
> Hello
> Bar
> Hello world!
> EOF
Hello world!
Bar
Hello world!
world!/' <<EOF > Hello > Bar > Hello world! > EOF Hello world! Bar Hello world!
    
por 06.06.2018 / 17:27

Tags