Переменные для создания шаблонов для использования с sed

Я написал функцию 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-
}
1
задан 1 November 2021 в 13:33

0 ответов

Другие вопросы по тегам:

Похожие вопросы: