題 GNU Grep可以輸出一個選定的組嗎?


是否可以使用GNU grep從表達式中獲取匹配的組?

例:

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

哪個會輸出“'bar'”。但是我想得到“bar”,而不必再通過grep發送它(即獲得匹配的組)。那可能嗎?


42
2017-07-22 23:26


起源




答案:


您可以使用 sed 為了這。在BSD上 sed

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

或者,沒有 -E 選項:

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

這不適用於多行輸入。為此你需要:

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

46
2017-07-22 23:30



謝謝,忘記了sed。但要澄清一下,sed不接受論證-E .. - Torandi
嗯,它在我的機器上(Mac OS X)。經過進一步檢查,在手冊頁中:“-E,-a和-i選項是非標準的FreeBSD擴展,可能在其他操作系統上不可用。” - jtbandes
-r似乎對我而言。 - Torandi
@jtbandes:你不需要這個表達式的擴展功能..我只需要3個轉義字符 ( ) + 使用 \( \) \+:這實際上是一樣的: sed "s/.*'\([^']\+\)'.*/\1/" - Peter.O
這不適用於多行輸入。為此你需要: sed -n "s/.*'\([^']\+\)'.*/\1/p" - phreakhead


雖然grep無法輸出特定的組,但您可以使用lookahead和後面的斷言來實現您的後續操作:

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


26
2018-01-10 23:33



grep -P 並非在所有平台上都可用。但如果是這樣的話,使用lookahead / behind是解決問題的一種非常好的方法。 - Sébastien
grep智能與後視斷言?它是如何通過長時間觀察表現的?它是否將後視融入某種形式 “後綴樹” 與正則表達式的其餘部分? - Ross Rogers


您可以使用 \K 重置並丟棄左手匹配文本以及未添加到匹配文本的前瞻:

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

僅限GNU grep。


2
2018-02-27 18:15