Text-Processing

GNU grep 的 -o 選項是否忽略零長度匹配?

  • October 26, 2019

我在另一個建議的網站上找到了答案grep -oP '^\w+|$。我指出這|$在 PCRE 中是沒有意義的,因為它只是意味著“或行尾”,因此對於正常行總是如此。但是,grep當與-o. 考慮以下:

$ printf 'ab\na\nc\n\n' | perl -ne 'print if /ab|$/'
ab
a
c

$

(我包括第二個提示符 ( $) 以顯示空行包含在結果中)。

正如預期的那樣,在 Perl 中,這將匹配每一行。要麼是因為它包含一個,要麼是ab因為$匹配了行尾。沒有標誌的GNUgrep的行為方式相同:-o

$ printf 'ab\na\nc\n\n' | grep -P 'ab|$'
ab
a
c

$

但是,-o改變了行為:

$ printf 'ab\na\nc\n\n' | grep -oP 'ab|$'
ab
$

這與簡單地 grepping for 相同ab。第二部分,“或行尾”似乎被忽略了。-o沒有標誌,它確實可以按預期工作:

這是怎麼回事?是否 -o忽略 0 長度匹配?這是一個錯誤還是預期的?

我的 GNU grep 手冊頁顯示以下內容:

-o,–僅匹配

> > 僅列印匹配行的匹配(非空)部分,每個這樣的部分在單獨的輸出行上。 > > >

重點是我的

我猜它認為行尾匹配是“空匹配”

OR 的兩側

第二部分,“或行尾”似乎被忽略了。

不,不是,如果我們稍微改變匹配:

$ printf 'ab\na\n\nc\n' | grep -oP 'ab|.$'
ab
a
c

OR的兩個部分都是顯式匹配的。

空匹配

忽略的是“空”匹配(結果字元串的長度為零):

$ printf '%s\n' ab " " a "" c | grep -oP '^.*$'
ab

a
c

它記錄在案(在 GNU grep 中)LESS=+'/^ *-o,' man grep(強調我的):

-o, –only-matching

Print only the matched (非空) parts of a matching line, with each such part on a separate output line.

引用自:https://unix.stackexchange.com/questions/548866