GNU Grepは選択したグループを出力できますか?


47

GNU grepを使用して、式から一致するグループを取得することは可能ですか?

例:

echo "foo 'bar'" | grep -oE "'([^']+)'"

これは「 'bar'」を出力します。しかし、もう一度grepを介して送信する(つまり、一致したグループを取得する)ことなく、「バー」を取得したいと思います。それは可能ですか?

回答:


50

sedこれに使用できます。BSDの場合sed

echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"

または、-Eオプションなし:

sed "s/.*'\([^']\+\)'.*/\1/"

これは、複数行入力では機能しません。そのために必要なもの:

sed -n "s/.*'\([^']\+\)'.*/\1/p"

ありがとう、sedを忘れていました。ただし、明確にするために、sedは引数を取りません-E ..
Torandi 09

ええと、それは私のマシン(Mac OS X)で行います。さらに調査すると、manページで「-E、-a、および-iオプションは非標準のFreeBSD拡張機能であり、他のオペレーティングシステムでは利用できない可能性があります。」
jtbandes 09

1
-rは私にはそう思われます。
トランディ09

1
@jtbandes:あなたはこの式の拡張機能を必要としない..私はちょうど3つのエスケープ文字が必要です( ) +使用する\( \) \+:これは実質的に同じである:sed "s/.*'\([^']\+\)'.*/\1/"
Peter.O

2
これは、複数行入力では機能しません。そのために必要なもの: sed -n "s/.*'\([^']\+\)'.*/\1/p"
phreakhead

28

grepは特定のグループを出力できませんが、先読みと背後のアサーションを使用して、目的を達成できます。

echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"


8
grep -Pすべてのプラットフォームで利用できるわけではありません。しかし、そうであれば、lookahead / behindを使用することは、問題を解決する非常に良い方法です。
セバスチャン

1
grepは、後読みのアサーションに対応していますか?長い後読みでどのように動作しますか?後読みを正規表現の残りのある種の「接尾辞ツリー」に統合していますか?
ロスロジャース

3

\Kマッチテキストに追加されない先読みとともに、左側のマッチテキストをリセットして破棄するために使用できます。

$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar

GNU grepのみ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.