Me gustaría escribir una función bash que imprima secciones de texto encerradas entre líneas que coincidan ## mode: org
y ## # End of org
en un archivo, con una línea vacía entre las secciones. Sin embargo, antes de ##
, puede haber cualquier cantidad de espacios.
A continuación se muestra un ejemplo de un archivo del que extraer información.
file: test.sh
## mode: org
## * Using case statement
## # End of org
case $arg in
("V")
echo "Author"
;;
(*)
## mode: org
## ** Silent Error Reporting Mode (SERM) in getopts
## *** Detects warnings without printing built-in messages.
## *** Enabled by colon {:} as first character in shortopts.
## # End of org
break
;;
esac
El resultado deseado sería
* Using case statement
** Silent Error Reporting Mode (SERM) in getopts
*** Detects warnings without printing built-in messages.
*** Enabled by colon {:} as first character in shortopts.
lo he hecho con
capture-org ()
{
sed -n '/^ *## mode: org$/,/^ *## # End of org$/s/ *//p' "$1" |
sed 's/^## mode: org$/\n## mode: org/' |
sed '/^## mode: org$/d' | sed '/^## # End of org$/d' | cut -c 3-
}
¿Se puede hacer de una manera más ordenada?
Respuesta1
sed '/^[[:space:]]*## mode: org$/,/^[[:space:]]*## # End of org$/!d; /^[[:space:]]*## mode: org$/d; s/^[[:space:]]*## # End of org$//g; s/^[[:space:]]*## //'
Esto eliminará todo lo que no esté dentro de los patrones de inicio y fin. Luego eliminará el patrón inicial y reemplazará el patrón final con una línea vacía (que se convierte en el separador de bloques).