我的数据如下所示:
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
有人能指出我做错的方向吗? 谢谢!
答案 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