Bash を使用した遅延正規表現

Bash を使用した遅延正規表現

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

関連情報