sed + adiciona palavra antes da string somente se não existir

sed + adiciona palavra antes da string somente se não existir

Temos a seguinte linha em um arquivo no Linux:

discovery.uri=http://master.navada.com:8800

queremos adicionar a palavra kokobefore 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 kokoapenas se kokoainda 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 kokomasterexiste 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 kokopalavra somente se kokonão existir antes masterda 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 masterstring em outro lugar, mesmo que kokomastertenha 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 sedde jeito nenhum, mas jqou alguma outra ferramenta apropriada escrita especificamente para lidar com arquivos desse formato.

Responder2

Usar

sed 's/\(koko\)*master/kokomaster/'

so mastere qualquer número de kokos 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

informação relacionada