用(和|或)运算符grepping column

时间:2014-09-29 10:32:30

标签: grep

我的数据如下所示:

bark    art|evt|evt|nat
barnburner  evt|hum
bash    evt|evt
battle  act|act|act|evt|evt
bay anm|art|art|art|evt|nat|plt
beat    act|act|atr|com|evt|evt|evt|hum|loc|tme
beating act|act|evt|evt
bread   act|act|evt|evt|hum|nat

我希望能够从中提取第一列中包含任何字符串的所有行,但在第二列中提取特定的信息模式。 更具体地说,我想提取第二列中 evt 的行,至少我指定的另一个值。

例如,我想提取所有 evt 至少 hum nat 的行(或同时 hum nat 以及 evt 。 因此,我想要的结果是:

bark    art|**evt**|**evt**|**nat**    
barnburner  **evt**|**hum**
bay anm|art|art|art|**evt**|**nat**|plt
beat    act|act|atr|com|**evt**|**evt**|**evt**|**hum**|loc|tme
bread   act|act|**evt**|**evt**|**hum**|**na**t

我一直尝试使用grep执行此操作但没有成功。

我一直在尝试的是:

$ grep 'evt\|(hum|nat)' file

有人能指出我做错的方向吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

的grep:

  • 默认: BRE (基本正则表达式),你必须逃避一些特殊的字符赋予它们的特殊含义。比如|, ( ...

  • -E选项: ERE (扩展正则表达式),您可以将一些特殊字符转义为特殊含义远离。比如|, (, {...

所以你使用grep的默认选项, BRE evt\|(hum|nat)匹配 "evt" or literal "(hum|hat)" BRE ,您所寻找的内容可能是:evt|\(hum\|nat\)此处\( and \|具有特殊含义。

或者使用-E BRE,然后您可以grep 'evt\|(hum|hat)\|取消特殊含义,使其与文字"|"匹配

答案 1 :(得分:1)

你是如此接近,只需使用扩展正则表达式参数E

$ grep -E 'evt\|(hum|nat)' file
bark    art|evt|evt|nat
barnburner  evt|hum
bay anm|art|art|art|evt|nat|plt
beat    act|act|atr|com|evt|evt|evt|hum|loc|tme
bread   act|act|evt|evt|hum|nat