Substituindo string1 pela string 2 em linhas contendo string3 - com string1 ocorrendo várias vezes

1

Eu uso o seguinte comando para substituir uma string específica (substitua string1 por string2) em linhas que contenham outra string (string3).

  sed -i '/string3/ s/string1/string2/' file.txt

PROBLEMA ...

O comando acima funciona bem - MAS - apenas substitui string1 por string2 na primeira ocorrência de string1 na linha que contém string3.

Eu tenho que executar o comando várias vezes para garantir que todas as ocorrências de string1 sejam substituídas.

  sed -i '/string3/ s/string1/string2/' file.txt
  sed -i '/string3/ s/string1/string2/' file.txt
  sed -i '/string3/ s/string1/string2/' file.txt

Existe uma maneira de substituir todas as ocorrências de string1 em uma linha contendo string3 em uma única etapa?

Isso pode me ajudar a diminuir meu arquivo bash.

Muito obrigado.

    
por speld_rwong 27.07.2017 / 17:59

3 respostas

4

Tudo o que você precisa fazer é adicionar o sinalizador "substituto global" do sed ao final:

sed -i '/string3/ s/string1/string2/g' file.txt
    
por 27.07.2017 / 18:00
1

Para fins de conclusão, enquanto a solução óbvia nesse caso é adicionar o g flag, há alguns casos em que você pode querer executar o comando s/string1/string2/ (ou s/string1/string2/g ) várias vezes.

Por exemplo, se em vez de string2 , você tiver str , em uma entrada como:

string1ing1

s/string1/str/g resultaria em:

string1

Se você quisesse str , precisaria de outro s/string1/str/g . Com sed , há uma maneira idiomática de executar uma substituição, desde que seja bem-sucedido usando o comando t :

sed '
  /string3/{
    :1
    s/string1/string2/
    t1
  }'

t ramifica para o rótulo :1 somente se tiver havido um comando s bem-sucedido.

    
por 27.07.2017 / 19:22
0

enquanto a pergunta é marcada com sed e é dada a resposta perfeita acima, mas aqui está a versão awk para quem estiver procurando.

awk '/string3/{gsub("string1", "string2", $0)}1' infile.txt 
    
por 27.07.2017 / 18:22