Reemplazo multilínea en shell

Reemplazo multilínea en shell

Tengo los siguientes fragmentos de texto en un archivo de texto:

* Exported from Foo *

Title and Section

y otro

* Exported from Foo *

Other Title and Other Section

Necesito reemplazar esto con

# Title and Section

y

# Other Title and Other Section

Ahora puedo hacer esto con:

echo "$(grep -A 2 "Exported from Foo" ../tmp/data/${nospacefile} | grep -v "Exported from Foo" | grep -v -- -- | tr -d '\r' | grep -v -e '^[[:space:]]*$' | sed -e 's/^[ \t]*//')" | while read -r title; do sed -i -e "s/^\([[:blank:]]*\)$title/\# $title/g" ../tmp/data/${nospacefile}; done

Sin embargo, la cadena "Título y sección" u "Otro título y otra sección" también aparece en lugares que no quiero reemplazar. Solo quiero que se reemplace si aparece después de la línea Exportado y una línea en blanco.

¿Cuál es la mejor construcción de shell disponible para hacer esto? Estoy más que feliz de enviar stdout a perl, python, lo que sea.

Respuesta1

Puede intentar ed(1)editar la tercera línea a partir de * Exported from Foo *independientemente de si la segunda línea está vacía o no.

Para simplemente imprimir la salida stdoutcomo sed

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' ,p Q | ed -s file.txt 

Eso simplemente imprime la salida para stdouteditar el archivo en su lugar.

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' w | ed -s file.txt 

Para utilizar un edscript que simplemente imprima la salida enstdout

cat script.ed

Producción

g/^\* Exported from Foo \*$/+2s/^/# /
,p
Q

El script que edita el archivo.in-place

g/^\* Exported from Foo \*$/+2s/^/# /
w
q

Ahora puedes hacer

ed -s file.txt < script.ed

información relacionada