¿Se puede sed
agregar 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 perl
expresió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 coincidaapache 4.2
.s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print
buscaOs version rhel5.6
y reemplaza la línea con la misma agregandoapache 4.2
una 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.2
incondicionalmente a todas las líneas que coinciden, Os version rhel5.6
luego (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