GNU grepを使用して式から一致するグループを取得することは可能ですか?
例:
echo "foo 'bar'" | grep -oE "'([^']+)'"
これは「バー」を出力します。しかし、grepを介してもう一度送信する必要がない(つまり、一致するグループを取得する)ことなく、「バー」だけを取得したいと思います。それは可能ですか?
これにはsed
を使用できます。 BSDの場合sed
:
echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"
または、-E
オプションなし:
sed "s/.*'\([^']\+\)'.*/\1/"
これは複数行入力では機能しません。そのために必要なもの:
sed -n "s/.*'\([^']\+\)'.*/\1/p"
Grepは特定のグループを出力できませんが、先読みとビハインドアサーションを使用して、目的を達成できます。
echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"
\K
を使用して、左側の一致テキストと、一致テキストに追加されていない先読みをリセットして破棄できます。
$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar
GNU grepのみ。