使用正则表达式匹配字符恰好重复 n 次的行

Eri*_*ric 6 grep

我正在寻找与一行中的字符串rr完全匹配的 grep 正则表达式。
数据文件的一个例子是:

rr                     
qrrr                 
  abc rr d                
rarrrrrr aaa rr qq   
kdhd rr aa   rr zaza

和预期的结果:

rr
  abcrr d
rarrrrrr aaa rrqq
kdhdrraa rrzaza
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Sté*_*las 11

使用标准grep语法和 BRE:

$ grep -x '\(.*[^r]\)\{0,1\}rr\([^r].*\)\{0,1\}' <文件
rr
abcrd
rarrrrrr aaa rrqq
kdhdrraa rrzaza

(替换rrr\{42\}42个rS)

即在可选(0 或 1,相当于 ERE )上匹配 e x(即整行),前面是以除( )以外的字符结尾的字符序列,并且可选地后跟以开头的字符序列以外的字符。rr\{0,1\}?r[^r]r

使用 ERE:

$ grep -E '(^|[^r])rr([^r]|$)' < 文件
rr 
ab crr d
rarrrrrr aaa rrq q
kdh drra a rrz aza

(替换rrr{42}42个rS)

rr由线或比其他字符的任一个开始之前r和随后线的任末端或以外的字符r

使用 PCRE(非标准):

$ grep -P '(?<!r)rr(?!r)' < 文件
rr 
abc rr d
rarrrrrr AAA RR qq
kdhd rr aa rr zaza

(替换rrr{42}42个rS)

也就是说,rr 既不在 之前也不在 之后r

使用增强RE (ast-open grep):

$ grep -xX '(.*r)!rr(r.*)!' < 文件
rr
abcrd
rarrrrrr aaa rrqq
kdhdrraa rrzaza

(替换rrr{42}42个rS)