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

¿Puede agregar una nueva línea debajo de un contenido específico, si el contenido de input existe, entonces déjelo?

Contenido actual del file ssss

 Hostname example.com Os version rhel5.6 apache 4.2 Hostname example2.com Os version rhel5.6 

Contenido deseado del file ssss

 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 command

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 file y luego dejarlo. Si el contenido no existe, agréguelo.

Esta expresión perl hará el truco,

 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/ salta cualquier línea que coincida con apache 4.2 .
  • s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print búsqueda Os version rhel5.6 y reemplaza línea con lo mismo con la adición de apache 4.2 en nueva línea.

Prueba con tu file de input

 $ 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 

Aquí hay una forma de hacerlo con sed :

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

Esto agrega apache 4.2 incondicionalmente a todas las líneas que coinciden con la Os version rhel5.6 (si no está en la última línea) tira de la siguiente línea mediante n (imprime el espacio de patrones) y si el nuevo espacio de patrones coincide con apache 4.2 lo elimina . Ajuste la expresión regular si es necesario para include espacios iniciales / finales ej. /^[[:blank:]]*apache 4\.2[[:blank:]]*$/d