3

我有一条大线,如下所示

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

4 回答 4

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
于 2013-10-11T13:36:38.253 回答
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
于 2013-10-11T13:37:12.543 回答
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

解释

来自AWK 手册

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

gsub 函数返回进行的替换次数。

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

于 2013-10-11T13:35:56.700 回答
-1

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

.*?(abc\|).*?(abc\|).*?
于 2013-10-11T14:15:00.237 回答