找到至少两次重复模式的线条?

时间:2013-10-11 13:33:35

标签: regex linux bash shell grep

我的行有大行,如下所示

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

4 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分: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

答案 2 :(得分:0)

使用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(regexp,replacement,target)

     

gsub函数返回所做的替换次数。

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

答案 3 :(得分:0)

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

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