unix 在egrep中匹配A,后跟相同数量的B

f3temu5u  于 2022-11-04  发布在  Unix
关注(0)|答案(4)|浏览(196)

假设我想匹配一个模式,其中A和B的字符数完全相同,这样正好有n个A,后面跟着n个B。例如,可以匹配以下字符串。

  1. AB公司
  2. AABB公司
  3. AAABBB公司
    另一方面,这些字符串无法匹配
    1.建筑事务所
  4. AAABB公司
    1.澳大利亚广播公司
    1.阿巴
    为了解决这个问题,我考虑的是重复计数,所以我的尝试看起来像这样
egrep 'A{n}B{n}'

然而,当然,花括号内的重复计数n不能被隐含地定义。
虽然我知道如何编写程序来匹配它,但我正在Mac终端上测试它,因此我试图利用egrep的任何可能的特性来编写一个句型。
因此,任何人都可以请帮助我解决这个问题,任何帮助将不胜感激。

4ioopgfo

4ioopgfo1#

如果您有gnu grep,则可以使用以下递归PCRE正则表达式:

grep -P '^(A(?1)?B)$' file

AB
AABB
AAABBB

或者,您可以使用awk来使用此非正则表达式方法:

awk '(n=index($0, "B")) && length(substr($0, 1, n-1)) == length(substr($0, n))' file

AB
AABB
AAABBB

awk使用index函数查找第一个B,并提取2个子字符串(即所有As和所有Bs),如果As子字符串的长度与Bs子字符串的长度相同,则打印每个记录。

qyzbxkaa

qyzbxkaa2#

两种可供选择的GNUawk方法:
--使用match函数:

awk '{ match($0,/^(A+)(B+)$/,a) }length(a) && length(a[1])==length(a[2])' file

--使用FPAT变量定义字段值

awk -v FPAT="A|B" '{ for(i=1;i<=NF;i++) { ($i=="A" && $(i-1)!="B")? a++:b++ } }a==b' file

输出(对于两种方法):

AB
AABB
AAABBB
8tntrjer

8tntrjer3#

我们可以在awk中完成此操作,使用您显示的示例,请尝试以下awk。在GNU awk中编写和测试,应该可以在任何版本的awk中工作。

awk '
match($0,/^A+/){
  len=RLENGTH
  match(substr($0,RSTART+RLENGTH),/^B+/)
  if(len==RLENGTH){ print }
}
'  Input_file
ujv3wf0j

ujv3wf0j4#

如果这些行 * 只有 * A和B,没有其他内容,那么这里有一个基于awk的解决方案,不需要使用match()函数:

BBBBBBAAAAAAA
AAAABBBBBB
AAAAAAAAAAAABBBBBBBBBBBBBBBBBB
AABBBB
BBAAA
AAAABBBB
AAAAAAABBBBBBAAAAAABBBBBB
AAAABBB
BBAA
AAABBAABB
AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBB
AAABBB
AAAAABBBB
AAABB
AABB
AAAAAAAAAAAABBBBBBBBBBBB
BAA
AABBAABB
AAAAAABBBBBB
AAAAAABBBBBBAAAAAABBBBBB
AAABB
AAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBB
ABAB
AAAAAAABBBB
AAAAAAABBBBBB
AAAAAABBBB
AAABB
AABB
AAAAAAAAAAAAABBBBBBBBBBBB
AAAAAAABBBBBB
AB
AAAAABBBBBB
BBBBBBAAAAAA
AAB
AABBB
AAABBB
AAAAAAAAAAAAAAAAAABBBBBBBBBBBB
AAAAAAAAAAAAABBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAABBBBBBBBBBBB
AAAAAABBBBBB
AABAB
BA

|

{m,g}awk '((_=length)%__)</^A+B+$/ && _==index($!__,"AB")*__' FS='^$' __=2

 1  AAAABBBB
 2  AAABBB
 3  AABB
 4  AAAAAAAAAAAABBBBBBBBBBBB
 5  AAAAAABBBBBB
 6  AAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBB
 7  AABB
 8  AB
 9  AAABBB
10  AAAAAABBBBBB

这可以通过视觉快速检查:

AAAABBBB
               AAABBB
                AABB
      AAAAAAAAAAAABBBBBBBBBBBB
            AAAAAABBBBBB
AAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBB
                AABB
                 AB
               AAABBB
            AAAAAABBBBBB

相关问题