我有一个文本文件 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
[xyz]
所谓的括号表达式是匹配一组中的一个字符。在这里,要么x
,y
要么z
。[\d]
将匹配\
或d
在 POSIX 基本正则表达式中匹配,但在与 perl 兼容的正则表达式中,它与\d
单独匹配:一个数字。例如,这允许[\da-fA-F]
匹配一个十六进制数字,但在这种[\d]
情况下,它是没有意义的,你不妨使用\d
.在任何情况下,它都不适用于您
\(...\)
在 POSIX 基本正则表达式或(...)
POSIX 扩展正则表达式或 PCRE 中需要的分组。PCRE 有一些其他的分组变体,例如
(?:...)
哪些组不创建反向引用,或者(?|...)
哪些组影响反向引用的交替编号方式,或者(?>...)
分组运算符的所有格变体等。在这里,您不需要反向引用,因此您不妨使用
(?:...)
:将匹配包含2 个(2 个数字后跟 a
:
)的行。如果您想在实际上匹配的行上进行匹配,则需要x
添加该-x
选项。这里,
实际上会更短。
会产生相同的效果,但效率可能会稍低,因为我们没有告诉
pcregrep
不要打扰捕获(...)
.请参阅
man pcrepattern
以了解有关 PCRE 语法的更多信息。使用
grep