
Temos a seguinte linha em um arquivo no Linux:
discovery.uri=http://master.navada.com:8800
queremos adicionar a palavra koko
before master
, então eu apenas faço:
sed –i 's/master/kokomaster/' file
que dá:
discovery.uri=http://kokomaster.navada.com:8800
mas o que queremos é adicionar koko
apenas se koko
ainda não estiver presente antes master
.
Por exemplo, na próxima vez que executarmos
sed –i 's/master/kokomaster/' file
a linha será:
discovery.uri=http://kokokokomaster.navada.com:8800
Responder1
sed -i '/kokomaster/!s/master/koko&/' file
Primeiro teste se a string kokomaster
existe na linha e, caso não exista, faça a substituição. Esta é quase uma tradução literal de "mas o que queremos é adicionar a koko
palavra somente se koko
não existir antes master
da palavra" em sed
.
A &
parte de substituição da substituição será substituída pelo texto correspondente à parte do padrão (ou seja, master
).
Depois de ler os comentários (veja abaixo), você pode querer usar algo mais específico que na verdade modificaria apenas a parte do nome do servidor do URI, e não qualquer master
string em outro lugar, mesmo que kokomaster
tenha ocorrido (ou não) no caminho do URI:
sed -i 's,^\(discovery\.uri=http://\)\(master\),\1koko\2,' file
Você pode até querer ir mais longe e combinar o exato ecompletolinha que você deseja substituir, apenas para evitar erros hipotéticos:
sed -i 's,^\(discovery\.uri=http://\)\(master\.navada\.com:8800\)$,\1koko\2,' file
Se o arquivo de configuração estiver escrito em JSON ou algum outro formato bem conhecido, vocênão uso sed
de jeito nenhum, mas jq
ou alguma outra ferramenta apropriada escrita especificamente para lidar com arquivos desse formato.
Responder2
Usar
sed 's/\(koko\)*master/kokomaster/'
so master
e qualquer número de koko
s anteriores são substituídos.
Responder3
Você pode substituir um pouco mais para evitar esse problema:
sed -i sX/masterX/kokomasterX file
Isto substitui “/master”, então na próxima vez que você executá-lo, nada será substituído, já que “/kokomaster” não corresponde.
Responder4
Eu usei o comando awk abaixo para fazer o mesmo
comando
awk '$0 !~/kokomaster/{gsub("master","kokomaster",$0)}1' filename >file_tmp && mv file_tmp filename
saída
discovery.uri=http://kokomaster.navada.com:8800
discovery.uri=http://kokomaster.navada.com:8800