Grep
為什麼兩個標籤之間的 grepping 不適用於選項 -z?怎麼修?
這個案例:
$ 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
將字元串視為單行。也就是說,更改
"."
以匹配任何字元,甚至是換行符,通常它不會匹配。