Я хотел бы написать функцию bash, которая печатает разделы текста, заключенные между строками, соответствующими ## mode: org
и ## # End of org
в файле, с пустой строкой между разделами. Перед ##
может быть любое количество пробелов.
Вот пример файла, из которого можно извлечь информацию.
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
Желаемый результат будет таким:
* 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.
Я сделал это с
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-
}
Можно ли это сделать более аккуратно?
решение1
sed '/^[[:space:]]*## mode: org$/,/^[[:space:]]*## # End of org$/!d; /^[[:space:]]*## mode: org$/d; s/^[[:space:]]*## # End of org$//g; s/^[[:space:]]*## //'
Это удалит все, что не находится в пределах начального и конечного шаблонов. Затем он удалит начальный шаблон и заменит конечный шаблон пустой строкой (которая станет разделителем блоков).