除非包含foo
,,否则我希望显示除之外的所有行,除非它们还包含bar
。 Logically !(foo and (!bar)) === (!foo) or bar
,所以我可以使用两个单独的表达式。我可以使用单个grep
或egrep
进行此类匹配吗? -v
不起作用,因为它否定了两个表达式,我可能无法使用Perl正则表达式。
以下是有效的,但如果可以在egrep
中完成代码转换代码的工作要少得多:
$ echo '
foo
bar
moofoo
foobar
barbar' | grep -Pv '^((?!bar).)*foo((?!bar).)*$'
bar
foobar
barbar
手头的问题是速度(寻找以千兆字节为单位的模式)。
答案 0 :(得分:1)
如果使用awk就好了,那么下面会给出所需的输出
awk 'BEGIN {FS=" "};
{
if ($0 ~ /(foo)/)
{
if ($0 ~ /(bar)/)
{
print $0
}
}
else
{
print $0
}
}' FileContainingText.txt
因为这可以在每行工作而且不涉及管道,所以这应该很快。