¿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/}' file
Vea 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=foo
Detalles 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=foo
Usando 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