3

Unix grep を使用しています。それを使用して名前付きキャプチャ グループを処理する方法を知りたいです。

現在、これは私が持っているものです:

echo "foobar" | grep -P "(?<q>.)ooba(?<w>.)"

したがって、理論的には と がq=fありw=rますが、これらの変数を使用する方法や、パイプラインを介して次のコマンド (awk など) に渡す方法がわかりません。

最終的には、次の結果を得たいと考えています。

f r

上記の文字列は単なる例です。キャプチャ グループはどこにでもあり、任意の数である可能性があり、印刷も任意の順序である可能性があります。文字列の最後の文字と最初の文字を抽出する方法を特に探しているのではなく、文字列から必要な数の変数を抽出する方法を探しているので、これを言っています。-o\Kまたはを使用するようなトリックは知って(?<=some text).*?(?=some other text)いますが、これらは文字列の一部のみを抽出し、複数は抽出しません。

4

2 に答える 2

2

grepキャプチャされたグループを単独で印刷する機能はありませんが、sed与えられた例では、

echo "foobar" | sed 's/^\(.\)\(.\+\)\(.\)$/\1 \3/'
f r

これは文字通り、最初の文字に一致することを意味します-残りの文字列と最後の文字。\1これで、キャプチャされた個々のグループに..\n表記からアクセスできるようになりました。

正規表現のデモ

\中括弧を囲む理由はsed、デフォルトで BRE (Basic RegEx) を使用し、またはフラグ を使用して有効にできる ERE (Extended RegEx) を使用しないためです。ERE はサポートされていないため、基本的に、答えは BRE からの ERE トークンを次のようにエスケープしてシミュレートします。-E-rPOSIX sed\

于 2017-06-01T09:16:22.640 に答える