【问题标题】:find the lines with atleast twice repeated pattern?找到至少有两次重复模式的线条?
【发布时间】:2013-10-11 13:33:35
【问题描述】:

我有一条大线,如下所示

abc|Abc_12 cdf_rhtdm cdf|Cdf22 abc|Abc_100 ijm|smthr12
ddf|rtg_2 qwe_werth ddf|Cs2 abc|Abc_f0 ijm|styhr12 abc|Abc_33 ddf|Cs2 ddf|rtg_2
ddd_hm ddf|Cs2 ght|d_100 abc|Abc_55
cdf_rshtdm sdf|Cdf22 ght|d_100 ijm|smthr12     

我想创建一个新文件,其模式类似于abc|至少两次

所以,这里的输出将是

abc|Abc_12 cdf_rhtdm cdf|Cdf22 abc|Abc_100 ijm|smthr12
ddf|rtg_2 qwe_werth ddf|Cs2 abc|Abc_f0 ijm|styhr12 abc|Abc_33 ddf|Cs2 ddf|rtg_2

【问题讨论】:

  • 您的第二条排位赛中有ddf|abc| 都重复了。它是否符合ddf| 或 `abc|' 的条件?

标签: regex linux bash shell grep


【解决方案1】:

使用grep -P (PCRE):

grep -P '(abc\|.*?){2}' file

abc|Abc_12 cdf_rhtdm cdf|Cdf22 abc|Abc_100 ijm|smthr12
ddf|rtg_2 qwe_werth ddf|Cs2 abc|Abc_f0 ijm|styhr12 abc|Abc_33 ddf|Cs2 ddf|rtg_2

【讨论】:

    【解决方案2】:

    一种方法是使用带有基本正则表达式的grep

    grep '^.*\(abc|\).*\(abc|\).*$' your_file 
    abc|Abc_12 cdf_rhtdm cdf|Cdf22 abc|Abc_100 ijm|smthr12
    ddf|rtg_2 qwe_werth ddf|Cs2 abc|Abc_f0 ijm|styhr12 abc|Abc_33 ddf|Cs2 ddf|rtg_2
    

    【讨论】:

    • 或者不那么吵grep "abc|.*abc|"
    【解决方案3】:

    使用awk 可以非常简单地完成:

    $ awk '{if (gsub(/abc\|/, "abc", $0)>= 2) print}' file
    abcAbc_12 cdf_rhtdm cdf|Cdf22 abcAbc_100 ijm|smthr12
    ddf|rtg_2 qwe_werth ddf|Cs2 abcAbc_f0 ijm|styhr12 abcAbc_33 ddf|Cs2 ddf|rtg_2
    

    说明

    来自the AWK manual

    gsub(正则表达式,替换,目标)

    gsub 函数返回替换的次数。

    所以我们检查它的返回码,如果它是 2 或更多,我们打印该行。

    【讨论】:

      【解决方案4】:

      以下正则表达式应该会产生您正在寻找的输出...

      .*?(abc\|).*?(abc\|).*?
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-29
        • 2021-12-26
        • 2011-04-14
        • 1970-01-01
        • 2015-12-09
        • 2022-01-21
        • 2023-03-10
        相关资源
        最近更新 更多