Agregue una línea debajo de cada línea que coincida con un patrón solo si aún no está presente

Agregue una línea debajo de cada línea que coincida con un patrón solo si aún no está presente

¿Se puede sedagregar una nueva línea debajo de un contenido específico? Si el contenido de entrada existe, ¿déjelo?

Contenido actual del archivo.ssss

Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6

Contenido deseado del archivossss

Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6
apache 4.2

Puedo agregar el contenido con el siguiente comando

sed -i '/Os version rhel5.6/a apache 4.2' ssss

Mi pregunta

Quiero agregar una línea debajo de un contenido específico, si el contenido existe en el archivo, déjelo. Si el contenido no existe, agréguelo.

Respuesta1

Esta perlexpresión funcionará,

perl -i -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss

Explicación

  • next if /apache 4.2/omite cualquier línea que coincida apache 4.2.
  • s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; printbusca Os version rhel5.6y reemplaza la línea con la misma agregando apache 4.2una nueva línea.

Pruebe con su archivo de entrada

$ cat ssss
Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6

$ perl -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Hostname example.com
Os version rhel5.6
apache 4.2

Hostname example2.com
Os version rhel5.6
apache 4.2

Respuesta2

Aquí tienes una forma de hacerlo con sed:

sed '/Os version rhel5\.6/{
a\
apache 4.2
$!{
n
/^apache 4\.2$/d
}
}' infile

Esto se agrega apache 4.2incondicionalmente a todas las líneas que coinciden, Os version rhel5.6luego (si no está en la última línea) extrae la siguiente línea n(imprimiendo el espacio del patrón) y si el contenido del nuevo espacio del patrón coincide, apache 4.2 lo elimina. Ajuste la expresión regular si es necesario para incluir espacios iniciales/finales, por ejemplo/^[[:blank:]]*apache 4\.2[[:blank:]]*$/d

información relacionada