web-dev-qa-db-ja.com

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

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

例:

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

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

48
Torandi

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

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

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

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

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

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

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

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

28
Aldrik

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

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

GNU grepのみ。

4
drewk