使用 grep 多次查找精确模式

使用 grep 多次查找精确模式

输入文件的行如下所示:

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

相关内容