当存在多个/不完全匹配项时,“ grep -w -f”的行为

三重奏

grep -w -f用来从文件中提取与模式匹配的行。但是,如果输入模式文件中的模式不完全匹配,则似乎掩盖了稍后在输入模式文件中出现的完全匹配。我还有其他grep选择吗?例如:

$ head list
tt140
tt1351
tt1354
tt998
tt1122

$ head match1
tt135
tt1122
tt1351

$ grep -w -f match1 list
tt1122

看来第一个模式tt135match1干扰后面的模式tt1351如果第一行被删除,tt1351则报告匹配。

$ head match2
tt1122
tt1351

$ grep -w -f match2 list
tt1351
tt1122

这是预期的行为吗?还有另一种选择grep可以避免这种情况吗?

mklement0

确实,如@japyal所述,BSD版本BSD中grep似乎存在错误(这也影响OSX)。

解决方法

 grep -f <(sed 's/.*/\\<&\\>/' match1) list

这会将字符串动态地封装match1显式的单词边界正则表达式断言中,就好像match1已定义为:

\<tt135\>
\<tt1122\>
\<tt1351\>

最终效果与-w已指定的效果相同

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章