grep从资本开始,恰好出现三次

时间:2017-12-22 15:13:10

标签: regex unix grep

我需要注意这一点:以资本开头的那条线和相同的资本必须在线上完全出现3次。 例如。这是一条很好的路线:

'X^[<*'??X+BXK<:B7#;}V0|<|K!(P|HW}(1O@$JK_}}*.5H"Y&^A)D$QS97R' 

(以X和X开头显示三次) 我试过这个,但显然括号之间的反向引用不正常:

 ^\([A-Z]\)[^\1]*\1[^\1]*\1[^\1]* 

为什么这不起作用,我应该怎么做?

4 个答案:

答案 0 :(得分:0)

grep中,您需要使用\(...\)来创建捕获组。对于“以大写字母开头并且同一个字母出现三次”,您可以这样做:

grep '^\([A-Z]\).*\1.*\1'

答案 1 :(得分:0)

我将awk用于此

$ cat ip.txt
Xq2X46Xad
asAnAndA
YeYeYeY
CCC
EsE63Eu6u

$ awk '/^[A-Z]/{c=substr($0,1,1); n=split($0,a,c); if(n==4)print}' ip.txt
Xq2X46Xad
CCC
EsE63Eu6u
  • /^[A-Z]/如果行以大写字母
  • 开头
  • c=substr($0,1,1)将该字母保存在变量中
  • n=split($0,a,c)使用该字母拆分行并保存n
  • 中获得的字段数
  • 如果有四个字段,则打印该行

可以缩短为

$ awk '/^[A-Z]/ && split($0,a,substr($0,1,1))==4' ip.txt
$ # or, with GNU awk
$ gawk -v FS= '/^[A-Z]/ && split($0,a,$1)==4' ip.txt

答案 2 :(得分:0)

[^\1]并不代表否定反向引用\1

你必须使用负向前瞻,hanchor开始和结束,以及-P选项(对于PCRE):

grep -P '^([A-Z])(?:(?!\1).)*\1(?:(?!\1).)*\1(?:(?!\1).)*$'

如果它是一个大写

,这将在第一个字符的每一行中恰好匹配3次

答案 3 :(得分:0)

使用awk在FS为空时将输入拆分为字符(例如GNU awk):

$ awk -F '' '/^[A-Z]/ && gsub($1,"&")==3' file
X^[<*'??X+BXK<:B7#;}V0|<|K!(P|HW}(1O@$JK_}}*.5H"Y&^A)D$QS97R

在任何UNIX机器上的任何shell中都有任何awk:

$ awk '/^[A-Z]/ && gsub(substr($0,1,1),"&")==3' file
X^[<*'??X+BXK<:B7#;}V0|<|K!(P|HW}(1O@$JK_}}*.5H"Y&^A)D$QS97R

您可能希望将A-Z更改为[:upper:],以便移植到其他区域设置。