输入文件的行如下所示:
d-- s--:--- a++ C- UH++++ P++++ L--- E-- W- N++++ O-- M(+) !V PS- PE+++ Y++ PGP t+ 5++ X++ R+++ tv b+++ DI+++
X+++
我想找到至少出现 6 次该模式的行,其中 X 是任意字母。我尝试过以下命令: grep\(.*\+\+\+[[:space:]]\)\{6\}
但这似乎也与模式匹配X++++
。
输入示例:
d-- s--:--- a++ C- UH++++ P++++ L--- E-- W- N++++ o+++++ K+++ w+++ O-- M(+) !V PS- PE+++ Y++ PGP t+
C+++ U- P++++ L+++ E W- N+ o++($) K-- w+ O-- M-- V-$ PS PE++ Y-- PGP++++ t+++ 5+++ X+++ R* tv b++ DI+ D+++ !G
期望的输出:
C+++ U- P++++ L+++ E W- N+ o++($) K-- w+ O-- M-- V-$ PS PE++ Y-- PGP++++ t+++ 5+++ X+++ R* tv b++ DI+ D+++ !G
答案1
首先,你想要{6,}
“6或更多”,因为{6}
意味着“正好6”。接下来,如果您只是将 添加{6,}
到模式的末尾,则只会匹配连续的模式。所以这会匹配:
aa X+++ X+++ X+++ X+++ X+++ X+++
但这不会
X+++ a X+++ a X+++ X+++ X+++ X+++
因此,您需要使用(${pattern}.*){6,}
,意思是“查找 ' $pattern
,然后查找 0 个或多个字符' 6 次或更多次”。另外,您不仅要匹配[[:space:]]
行尾,以防最后一个X+++
是行中的最后一个。像这样的东西:
grep -E '([^+]\+\+\+([[:space:]]|$).*){6,}' file
请注意,如果使用-E
(或-P
),则需要转义 the+
但不需要转义(
, )
, |
, {
or}
如果不使用-E
,则不需要转义+
,但确实需要转义其他的,如果你不想从字面上理解的话。所以,如果没有-E
,那就是:
grep '\([^+]+++\([[:space:]]\|$\).*\)\{6,\}' file