2017-06-01 14 views
1

私はUnix grepを使用しています。名前付きキャプチャグループをどのように扱うことができるか知りたい。grepで名前付きのキャプチャグループ

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

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

だから、理論的には、私はq=fw=rを持っている、しかし、私はこれらの変数を使用することができる方法がわからないか、次のコマンドに手渡します(例えばawk)をパイプラインを介して送信する。最後に

、私は次のような結果を持っているしたいと思います:

f r

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

+2

grepはキャプチャグループへのアクセス権をまったく与えません。 –

+0

これは、https:// stackoverflowを形成できる場合に役立ちます。com/help/mcve ... – Sundeep

答えて

1

でそれらをエスケープすることによってBREからEREトークンをシミュレートします。ただし、これはgawkの場合ではありません。

あなたが述べた質問から、"ではなく、文字列から必要な数の変数を抽出するアプローチ"

sedは、1〜9個のグループで再生する必要がある場合に最適です。これが当てはまらない場合は、matchの機能gawkも役に立ちます。 (Inianと同じ正規表現を使用して)

echo "foobar" | awk '{match($0,/^(.)(.+)(.)$/,a);print a[1],a[3]}' 
f r 

PSは:また、より9. [グループを扱う場合、これは別のアプローチでは、それがうまく動作するより少ない数のために、本当に便利である可能性があります。また、、OFSFSのようなawkの変数と密接に結びついているので、書式設定が容易です。

0

grepだけでは捕らえグループを印刷する機能を持っていませんが、sedはあなたの特定の例で、文字通り意味

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

は、最初の文字と一致することができます - 文字列の残りの部分と最後の文字を。デフォルトでsedは、BRE(基本正規表現)とない ERE(拡張正規表現を使用しているため、今、あなたは\1から個々のキャプチャグループにアクセスすることができます。.. \n表記、

RegEx Demo

\理由ブレースの周りにあります)は、-Eまたは-rフラグを使用して有効にすることができます。 EREはPOSIXsedでサポートされていないので、基本的に答えはsed 9捕捉基の制限があり\

関連する問題