sed + agregar palabra antes de la cadena solo si no existe

sed + agregar palabra antes de la cadena solo si no existe

Tenemos la siguiente línea en un archivo en Linux:

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

queremos agregar la palabra kokoantes master, así que simplemente hago:

sed –i 's/master/kokomaster/' file

lo que da:

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

pero lo que queremos es agregar kokosolo si kokono está presente antes master.

Por ejemplo, la próxima vez que ejecutemos

sed –i 's/master/kokomaster/' file

la línea será:

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

Respuesta1

sed -i '/kokomaster/!s/master/koko&/' file

Primero pruebe si la cadena kokomasterexiste en la línea y, si no es así, realice la sustitución. Esta es una traducción casi literal de "pero lo que queremos es agregar la kokopalabra sólo si kokono existe antes de masterla palabra" en sed.

La &parte de reemplazo de la sustitución será reemplazada por el texto que coincida con la parte del patrón (es decir master).


Después de leer los comentarios (ver más abajo), es posible que desee utilizar algo más específico que en realidad solo modifique la parte del nombre del servidor del URI, y no ninguna mastercadena en otro lugar, incluso si kokomasterocurre (o no) en la ruta del URI:

sed -i 's,^\(discovery\.uri=http://\)\(master\),\1koko\2,' file

Es posible que incluso quieras ir tan lejos como para hacer coincidir exactamente yllenolínea que desea reemplazar, sólo para evitar errores incluso hipotéticos:

sed -i 's,^\(discovery\.uri=http://\)\(master\.navada\.com:8800\)$,\1koko\2,' file

Si el archivo de configuración está escrito en JSON o algún otro formato bien conocido, deberíano usar seden absoluto, pero jqo alguna otra herramienta adecuada escrita específicamente para manejar archivos de ese formato.

Respuesta2

Usar

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

entonces y se reemplaza mastercualquier número de s anteriores .koko

Respuesta3

Puedes reemplazar un poco más para evitar este problema:

sed -i sX/masterX/kokomasterX file

Esto reemplaza a “/master”, por lo que la próxima vez que lo ejecute, no se reemplazará nada, ya que “/kokomaster” no coincide.

Respuesta4

He usado el siguiente comando awk para hacer lo mismo

dominio

awk '$0 !~/kokomaster/{gsub("master","kokomaster",$0)}1'  filename >file_tmp && mv file_tmp filename

producción

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

información relacionada