ファイル内の## mode: org
と に一致する行で囲まれたテキストのセクションを、セクション間に空行を入れて印刷する bash 関数を記述したいと思います。 の前には、任意の数のスペースを入れることができます。## # 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:]]*## //'
これにより、開始パターンと終了パターンの範囲外にあるものがすべて削除されます。次に、開始パターンが削除され、終了パターンが空行 (ブロック区切りになる) に置き換えられます。