Comando sed para reemplazar texto

Resuelto
thierryR51 Mensajes publicados 144 Estado Miembro -  
zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   -
Hola,
Estoy intentando reemplazar una IP en el archivo hosts
cat /etc/hosts
80.119.80.108 Backup


He intentado esto:
sed -e"s/Backup/80.119.80.109 Backup/g" -i /etc/hosts;


Pero el resultado que obtengo es:
80.119.80.108 80.119.80.109 Backup

Quisiera eliminar 80.119.80.108 pero estoy atascado en la sem....... Estoy casi ahí, pero agradecería un poco de ayuda.
Gracias

Configuración: Mageia5 en Toshiba Satellite L350

--
Investigador en mejoras.

[url]

4 respuestas

  1. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 501
     
    Hola;

    sed -i.bak '/Copia de seguridad/{s/^[^ ]*/80.119.80.109/}' /etc/host
    s

    --
    _______________________________ ☯ Zen mis nuggets ☮ ______________________________
    Haced un gesto por el medio ambiente, cerrad vuestras ventanas y adoptad un pingüino… 🐧
    1
    1. thierryR51 Mensajes publicados 144 Estado Miembro 8
       
      Si lo incrusto en mi script con variables
      sed -i.bak '/'$nameServeur'/{s/^[^ ]*/'$newIp'/}' /etc/hosts

      obtengo 1 error en el primer carácter.
      sed -i.bak / 'MaMaison/{s/^[^ ]*/86.66.183.203/}' /etc/hosts
      sed: -e expresión n°1, carácter 1: dirección de expresión regular incompleta

      Me parece que lo he escrito bien....
      0
    2. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 501 > thierryR51 Mensajes publicados 144 Estado Miembro
       
      Hay un espacio de más en el nombre de tu variable $nameServeur ;-(

      / 'MaMaison/


      $ name=" Sauvegarde";nip="80.119.80.109"

      $ sed '/'${name}'/{s/^[^ ]*/'${nip}'/}' plop
      sed: -e expresión n°1, carácter 1: expresión regular de dirección incompleta

      $ name="Sauvegarde";nip="80.119.80.109"

      $ sed '/'${name}'/{s/^[^ ]*/'${nip}'/}' plop
      80.119.80.109 Sauvegarde
      0
    3. thierryR51 Mensajes publicados 144 Estado Miembro 8
       
      Gracias Zipe31. No paro de agradecerte... Va a acabar siendo cansino. ;)
      0
    4. thierryR51 Mensajes publicados 144 Estado Miembro 8
       
      Sin embargo, hice lo necesario para no tener este espacio en blanco
      nameServeur=${Serveurname%% }

      pero todavía está allí.
      0
    5. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 501 > thierryR51 Mensajes publicados 144 Estado Miembro
       
      ¿Cómo es la variable ${Serveurname} de inicio?
      0
  2. thierryR51 Mensajes publicados 144 Estado Miembro 8
     
    Gracias Zipe31. Siempre eres el gran especialista en bash....
    Buena noche.

    --
    Investigador en mejoras.

    [url]
    0
    1. thierryR51 Mensajes publicados 144 Estado Miembro 8
       
      1 línea de hosts se descompone así:
      IP + TAB + nombre de host

      Creo que todo el problema consiste en insertar el TAB.
      Parece que hay varios SED y no todos manejan el '\t'
      http://sed.sourceforge.net/sed1line_fr.html
      0
    2. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 501 > thierryR51 Mensajes publicados 144 Estado Miembro
       
      sed '/Respaldo/{s/[^\t]*/80.119.80.109/}' /etc/hosts
      0
    3. thierryR51 Mensajes publicados 144 Estado Miembro 8
       
      He adaptado a mis variables. De hecho, no escribe nada. Solo tengo la revisión de mi archivo.
      sed '/'${nameServeur}'/{s/^[^\t]*/'${newIp}'/}' $filehosts

      o $nameServeur = MaMaison
      $newIp=80.119.80.109
      $filehosts= /etc/hosts

      ¿Es porque la línea que contiene 'MaMaison' ya no existe en mi archivo?

      De hecho, me gustaría:
      Si la línea existe: reemplazarla
      Si no existe: crearla.

      Gracias por tu ayuda. La orden sed es complicada...
      0
    4. UnGnU Mensajes publicados 1468 Estado Colaborador 158 > thierryR51 Mensajes publicados 144 Estado Miembro
       
      Hola,

      Un ejemplo de archivo hosts sin la entrada MiCasa
      $ cat mi_archivo_hosts
      80.119.80.108 Respaldo

      Un ejemplo con las 2 entradas
      $ cat mi_archivo_casa
      80.119.80.108 Respaldo
      192.168.10.1 MiCasa

      El archivo de script para sed:
      $ cat script.sed
      /Respaldo/{
      s/[^\t]*/80.119.80.109/
      }

      /MiCasa/{
      s/[^\t]*/192.168.10.2/
      b
      }

      $ {
      a\192.168.10.2\tMiCasa
      }


      El script ejecutado sobre el archivo sin la ocurrencia de MiCasa:
      $ sed -f script.sed mi_archivo_hosts
      80.119.80.109 Respaldo
      192.168.10.2 MiCasa


      El script ejecutado sobre el archivo que ya tiene las 2 ocurrencias
      $ sed -f script.sed mi_archivo_casa
      80.119.80.109 Respaldo
      192.168.10.2 MiCasa
      0
    5. thierryR51 Mensajes publicados 144 Estado Miembro 8
       
      ```html OK, veo que con sed la solución existe. Así que para integrar esto en mi script, he hecho esto. No tengo un segundo archivo sed. Integro todo en mi script.
      sed -e '/'${nameServeur}'/{s/^[^\t]*/'${newIp}'/}';$ '{a\'${newIp}'\t'${nameServeur}'}' $filehosts

      La respuesta del comando es
      + sed -e '/MaMaison/{s/^[^\t]*/86.66.183.130/}'


      ^C

      Como puedes ver, se queda bloqueado. Tuve que terminar el script manualmente. Visiblemente, el ";" no parece estar siendo considerado. Sin embargo, he seguido los consejos de https://openclassrooms.com/courses/la-commande-sed donde dicen que para un comando de una sola línea, se separa con ";"

      ¿He entendido mal? ```
      0
  3. thierryR51 Mensajes publicados 144 Estado Miembro 8
     
    Pequeño problema. Cuando sed quiere escribir

     sed -i -e '/MaMaison/{s/^[^\t]*/86.66.183.119/}' -e b -e '$ a\86.66.183.119\tMaMaison' /etc/hosts

    si la línea no existe en el archivo hosts, no escribe nada.

    Veo que b está sin las comillas, pero en el script, sí están. Es en el resultado del comando donde desaparecen. Así que he reemplazado las comillas simples por dobles, pero tampoco funciona. ¿Podría ser esa la causa de que no se escriba nada?
    Gracias.

    --
    Investigador en mejoras.

    [url]
    0
    1. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 501
       
      Hola,

      Intenta así:
      sed -i -e '/MaMaison/{s/^[^\t]*/86.66.183.119/;b}' -e '$ a\86.66.183.119\tMaMaison' /etc/hosts
      0
  4. thierryR51 Mensajes publicados 144 Estado Miembro 8
     
    Efectivamente, el post 29 también menciona lo mismo y te respondí después. Funciona, pero no bien. Quizás deberíamos hacer 2 líneas sed con una condición "if"?

    --
    Investigador en mejoras.

    [url]
    0
    1. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 501
       
      Sin embargo...

      La entrada "MaMaison" no existe y se añade:
      $ cat hosts 
      80.119.80.108 Backup

      $ sed -e '/MaMaison/{s/^[^\t]*/86.66.183.119/;b}' -e '$ a\86.66.183.119\tMaMaison' hosts
      80.119.80.108 Backup
      86.66.183.119 MaMaison


      La entrada "MaMaison" existe y se modifica:
      $ cat maison 
      80.119.80.108 Backup
      192.168.10.1 MaMaison

      $ sed -e '/MaMaison/{s/^[^\t]*/86.66.183.119/;b}' -e '$ a\86.66.183.119\tMaMaison' maison
      80.119.80.108 Backup
      86.66.183.119 MaMaison
      0