Grep
如何grep重複模式的重複模式?
我有一個文本文件 fred.txt:
% cat -e fred.txt 00:$ 00:04:$ 01:00:23:34$ 01:$ 01:40:$ 01:40:32:$ %
我可以用 grep 查找包含 2 位數字和冒號的行:
% pcregrep -e '[\d]{2}:' fred.txt 00: 00:04: 01:00:23:34 01: 01:40: 01:40:32: %
但是當我嘗試獲取該模式的重複模式時,它找不到它們:
% pcregrep -e '[[\d]{2}:]{2}' fred.txt %
我希望得到與此相同的輸出:
% pcregrep -e '[\d]{2}:[\d]{2}:' fred.txt 00:04: 01:00:23:34 01:40: 01:40:32: %
最終我會在一個更大的文件中尋找更多嵌套的重複模式,所以我不想在每次模式重複時都定義。我如何 grep 具有該模式重複的行?
使用 GNU
grep
$ grep -Eo '([0-9]{2}:){2,}' fred.txt 00:04: 01:00:23: 01:40: 01:40:32:
[xyz]
所謂的括號表達式是匹配一組中的一個字元。在這裡,要麼x
,y
要麼z
。
[\d]
將匹配\
或d
在 POSIX 基本正則表達式中匹配,但在與 perl 兼容的正則表達式中,它與\d
單獨匹配:一個數字。例如,這允許[\da-fA-F]
匹配一個十六進制數字,但在這種[\d]
情況下,它是沒有意義的,你不妨使用\d
.在任何情況下,它都不適用於您
\(...\)
在 POSIX 基本正則表達式或(...)
POSIX 擴展正則表達式或 PCRE 中需要的分組。PCRE 有一些其他的分組變體,例如
(?:...)
哪些組不創建反向引用,或者(?|...)
哪些組影響反向引用的交替編號方式,或者(?>...)
分組運算符的所有格變體等。在這裡,您不需要反向引用,因此您不妨使用
(?:...)
:pcregrep '(?:\d{2}:){2}'
將匹配包含2 個(2 個數字後跟 a
:
)的行。如果您想在實際上匹配的行上進行匹配,則需要x
添加該-x
選項。這裡,
pcregrep '(?:\d\d:){2}'
實際上會更短。
pcregrep '(\d\d:){2}'
會產生相同的效果,但效率可能會稍低,因為我們沒有告訴
pcregrep
不要打擾擷取(...)
.請參閱
man pcrepattern
以了解有關 PCRE 語法的更多資訊。