Grep

為什麼兩個標籤之間的 grepping 不適用於選項 -z?怎麼修?

  • November 23, 2021

這個案例:

$ cat t01.txt
xxxyyyzzz

$ cat t01.txt | grep -Po '(?<=xxx).*(?=zzz)'

結果是:

yyy

這是預期的。

但是,這種情況:

$ cat t02.txt
xxx
yyy
zzz

$ cat t02.txt | grep -Pzo '(?<=xxx).*(?=zzz)'

結果是:

<nothing>

這是出乎意料的。

為什麼以及如何解決?

因為預設情況下,.不匹配 Perl 正則表達式中的換行符。您需要明確匹配它,或者使用s正則表達式的標誌:

$ < t02.txt grep -Pzo '(?<=xxx\n).*\n(?=zzz)'
yyy
$ < t02.txt grep -Pzo '(?s)(?<=xxx).*(?=zzz)'

yyy

參見例如perlre手冊頁

在“元字元”部分:

.   Match any single character except newline    Not in []
    (under /s, includes newline)

在“修飾符”中:

s

將字元串視為單行。也就是說,更改"."以匹配任何字元,甚至是換行符,通常它不會匹配。

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