Я написал функцию bash для печати частей текста, заключенных между строками, соответствующими режиму ##: 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 ()
{
local efile="$1"
local begsec="## mode: org"
local endsec="## # End of org"
sed -n "/^[[:space:]]*${begsec}$/,/^[[:space:]]*${endsec}$/s/ *//p'" "$efile" |
sed 's/^'"${begsec}"'$/\n'"${begsec}"'/' |
sed '/^'"${begsec}"'$/d' | sed '/^'"${endsec}"'$/d' | cut -c 3-
}
Я хотел бы упростить функцию, используя переменные для построения шаблонов. Но мне нужна помощь в компиляции команд, чтобы мне не приходилось столько раз вызывать sed
.
Возможно, использование awk
было бы лучшей стратегией.
capture-org ()
{
local efile="$1"
local begsec='^[[:space:]]*## mode: org$'
local endsec='^[[:space:]]*## # End of org$'
sed -n "/${begsec}/,/${endsec}/s/ *//p" "$efile" |
sed 's/^## # End of org$/## # End of org\n/' |
sed '/^## mode: org$/d' | sed '/^## # End of org$/d' | cut -c 3-
}