Grep

如何grep重複模式的重複模式?

  • February 2, 2022

我有一個文本文件 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 具有該模式重複的行?

使用 GNUgrep

$ grep -Eo '([0-9]{2}:){2,}' fred.txt 
00:04:
01:00:23:
01:40:
01:40:32:

[xyz]所謂的括號表達式是匹配一組中的一個字元。在這裡,要麼xy要麼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 語法的更多資訊。

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