¿Hay alguna manera de reemplazar las siguientes dos líneas después de encontrar una coincidencia usando sed?
tengo un archivo
#ABC oneSize=bar twoSize=bar threeSize=foo Pero me gustaría reemplazar las dos líneas inmediatas una vez que el patrón #ABC para que se convierta en
#ABC oneSize=foo twoSize=foo threeSize=foo Puedo gsed '/^#ABC/{n;s/Size=bar/Size=foo/}' file
Pero solo cambia la línea twoSize no oneSize
¿Hay alguna manera de hacer que cambie tanto oneSize como twoSize?
Puedes repetir los comandos:
gsed '/^#ABC/{n;s/Size=bar/Size=foo/;n;s/Size=bar/Size=foo/}' fileVea la demostración en línea .
El comando n " imprime el espacio del patrón, luego, independientemente, reemplaza el espacio del patrón con la siguiente línea de entrada. Si no hay más entradas, sed sale sin procesar más comandos ".
Entonces, la primera vez que se usa, reemplaza en la primera línea después de la línea que comienza con #ABC , luego reemplaza en la segunda línea debajo de esa.
gnu y algunas otras versiones de sed le permiten tomar un rango usando un número relativo para que simplemente pueda usar:
sed -E '/^#ABC$/,+2 s/(Size=)bar/\1foo/' file #ABC oneSize=foo twoSize=foo threeSize=fooDetalles del comando:
/^#ABC$/,+2 Rango de coincidencia desde el patrón #ABC hasta las siguientes 2 líneass/(Size=)bar/\1foo/ : Haga coincidir Size=bar y reemplace con Size=foo , usando un grupo de captura para evitar la repetición de la misma cadena en la búsqueda y sustitución También puede considerar awk para evitar repetir el patrón y los reemplazos N veces si tiene que reemplazar N líneas después del patrón coincidente:
awk 'n-- {sub(/Size=bar/, "Size=foo")} /^#ABC$/ {n=2} 1' file #ABC oneSize=foo twoSize=foo threeSize=fooUsando sed , el ciclo se interrumpirá cuando ya no se encuentre Size=bar , por lo tanto, se reemplazarán las primeras 2 líneas después de la coincidencia.
$ sed '/^#ABC/{:l;n;s/Size=bar/Size=foo/;tl}' input_file #ABC oneSize=foo twoSize=foo threeSize=foo