Tudo o que você precisa fazer é adicionar o sinalizador "substituto global" do sed ao final:
sed -i '/string3/ s/string1/string2/g' file.txt
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.
Tudo o que você precisa fazer é adicionar o sinalizador "substituto global" do sed ao final:
sed -i '/string3/ s/string1/string2/g' file.txt
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.
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
Tags text-processing sed