Bash の組み込み正規表現関数を使用して、HTML タグ内に含まれるテキストのみを一致させようとしています。
string='<span class="circle"> </span>foo</span></span>'
regex='<span class="circle"> </span>(.+?)</span>'
[[ $string =~ $regex ]]
echo "${BASH_REMATCH[1]}"
しかし、試合は捕らえられ続けますfoo</span>
。
インターネットには sed と grep の例が溢れているため、Bash 独自の正規表現に関するドキュメントはあまり見つかりませんでした。
答え1
インターネットに代替アプローチが溢れているのには理由があります。強制されたこれには bash を使用します。この作業用に設計されたツールの 1 つを使用してみませんか?
とにかく、私が知る限り、演算子を使用して非貪欲な一致を行う方法はありません=~
。これは、bash の内部正規表現エンジンではなく、で定義されているシステムの C 正規表現エンジンを使用するためですman 3 regex
。これは で説明されていますman bash
。
An additional binary operator, =~, is available, with the same prece‐
dence as == and !=. When it is used, the string to the right of the
operator is considered an extended regular expression and matched
accordingly (as in regex(3)).
ただし、これは本当にない少し異なる正規表現を使用して、HTML ファイルを解析する良い方法を説明します。
string='<span class="circle"> </span>foo</span></span>'
regex='<span class="circle"> </span>([^<]+)</span>'
[[ $string =~ $regex ]];
echo "${BASH_REMATCH[1]}"
上記はfoo
期待どおりに返されます。
答え2
bash の正規表現が Perl のように非貪欲なマッチングを行うかどうかはわかりませんので、Perl 正規表現エンジンを使用します。
$ grep -oP '<span class="circle"> </span>\K.+?(?=</span>)' <<<"$string"
foo