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 stdout
como sed
printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' ,p Q | ed -s file.txt
Eso simplemente imprime la salida para stdout
editar el archivo en su lugar.
printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' w | ed -s file.txt
Para utilizar un ed
script 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