角かっこの間のすべての項目に一致する正規表現

角かっこの間のすべての項目に一致する正規表現

これまで、次の正規表現があります。

printf "this is (test.com)\n" | grep -Po '(?<=\().*(?=\))'

上記の正規表現は目的の出力を印刷します。テストネット

コードに新しい括弧を追加する限り

printf "this is (test.com) and (alex)\n" | grep -Po '(?<=\().*(?=\))'

、以下を表示します。

test.com)と(Alex

私の正規表現は角かっこの間にある内容を印刷したいです(数に関係なく)。さらに、括弧の間に特定の長さの単語だけを印刷する条件を追加したいと思います。

例:(aaa)テスト1(bbb)テストテスト(ccc)テスト(例)(ddd)

括弧内に長さ3の単語だけを印刷したいと思います。したがって、出力は次のようになります。

ああbbb ccc ddd

ベストアンサー1

表現方法にできるだけ注意してください最高長さ(gready regex)が一致します。例に示すように、(正規表現:角括弧の間の記号)が選択されました。

  • ...はい(test.com)と(Alex)

変える

  • ...はい(テストネット)そして(アレックス)

この動作をオーバーライドする方法は 2 つあります。

  1. any symbol制限または区切り記号に置き換えますrevers match(例:(.*)by([^)]*)
  2. 最新の正規表現(PCREなど)では、数量子を次のように指定できます。怠惰。彼らは怠惰にするために数量子の後ろに疑問符を付けました.*?。怠惰な数量子を使用すると、最初に式で最小の一致を試みます。

最初の変形よりも、これは単純化された正規表現を可能にします。grep -Po '\(\K[^)]*'

おすすめ記事