
Tenemos la siguiente línea en un archivo en Linux:
discovery.uri=http://master.navada.com:8800
queremos agregar la palabra koko
antes 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 koko
solo si koko
no 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 kokomaster
existe 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 koko
palabra sólo si koko
no existe antes de master
la 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 master
cadena en otro lugar, incluso si kokomaster
ocurre (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 sed
en absoluto, pero jq
o alguna otra herramienta adecuada escrita específicamente para manejar archivos de ese formato.
Respuesta2
Usar
sed 's/\(koko\)*master/kokomaster/'
entonces y se reemplaza master
cualquier 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