この非キャプチャグループにgrepが役に立ちますか?

この非キャプチャグループにgrepが役に立ちますか?

私はGNU / Linuxと正規表現に初めて触れました。最近は正規表現を身につけようとしています。これまではかなりしっかりした基本理解を持っていると思います。今PCREを掘っています。

これは私が使っている練習テキストファイルです:

01234 567890

01111-222111

09876.543210

次のようにして、正常に数字を一致させることができます。

(\d{5})[-.]?\s*?(\d{6})

最初の5桁は省略し、最後の6桁だけに一致するように非キャプチャグループを作成したいと思います。だから私は(?:)キャプチャしないグループを代表し、キャプチャしたくないものを入力したと思います。そうですか?だからそれは

(?:\d{5})[-.]?\s*?(\d{6})

ターミナルでPCREを使用してgrep -Po出力を表示しながら、これを実行しましたが、キャプチャグループが適用されていないかのように、まだ正確に一致する結果が得られました。

どのような指示がありますか?

ベストアンサー1

-oまたは、オプションを使用すると、キャプチャはgrepが一致の一部と見なす項目には影響しません--only-matching。すべての非キャプチャは、グループが利用可能な逆参照の1つとして計算されるか、置換がオプションのコンテキストで置き換えられないことを意味します。

たとえば、

$ printf 'aba\nabb\nabc\n' | grep -Po '(a)(b)'
ab
ab
ab
$ printf 'aba\nabb\nabc\n' | grep -Po '(a)(b)\1'
aba
$ printf 'aba\nabb\nabc\n' | grep -Po '(?:a)(b)\1'
abb

おそらくこの場合、あなたが探しているもの長さ0の行の後の主張:

printf 'aba\nabb\nabc\n' | grep -Po '(?<=a)b'
b
b
b

それとも\K「左を保ちなさい」という考え

$ printf 'aba\nabb\nabc\n' | grep -Po 'a\Kb'
b
b
b

(後者は可変長マッチングを可能にするので、やや柔軟です)。

例えば

$ grep -Po '\d{5}[-.]?\s*\K\d{6}' file
567890
222111
543210

おすすめ記事