Text-Processing
GNU grep 的 -o 選項是否忽略零長度匹配?
我在另一個建議的網站上找到了答案
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.