用grep排除

用grep排除,grep,sh,Grep,Sh,我有这个档案: $cat foo foo1 foo2 foo3 foo4 bar 我想让grep打印 foo3 bar 因此,基本上,我不知道如何排除除foo3之外的所有foo(例如-v)。可以通过以下方法完成: grep -v '^foo[^3]$' foo 您仍然使用-vexclude标志,但只有在foo条目后面跟一个非3时才排除它们 然而,虽然这对给定的输入文件有效,但您也可能希望去掉上面只有foo的行。如果需要,请使用: grep -v '^foo[^3]$' foo | grep

我有这个档案:

$cat foo
foo1
foo2
foo3
foo4
bar
我想让grep打印

foo3
bar
因此,基本上,我不知道如何排除除foo3之外的所有foo(例如-v)。

可以通过以下方法完成:

grep -v '^foo[^3]$' foo
您仍然使用
-v
exclude标志,但只有在
foo
条目后面跟一个非
3
时才排除它们

然而,虽然这对给定的输入文件有效,但您也可能希望去掉上面只有
foo
的行。如果需要,请使用:

grep -v '^foo[^3]$' foo | grep -v '^foo$'
或:

如果您的需求变得更复杂,那么最好选择更高级的工具。例如,上面的
grep
也将为您提供
foo39
。对于只需要
foo
行的情况,您可以使用
awk

awk '/^foo[34]$/||!/^foo/{print}' foo

使用
grep-v'foo[^3]”
,它将执行否定搜索。

您也可以采取直接方法:

grep "foo3\|bar"   # which is grep for foo3 or bar (must be double-quoted)

以下是您可以使用的
awk

awk '!/foo[^3]/' file
foo3
bar

您可以尝试下面的grep命令,该命令使用负前瞻

$ grep -vP '^(?!foo3)foo.*$' file
foo3
bar

它匹配除字符串
foo3
字符串之外的所有
foo
字符串。通过
-v
参数反转匹配将为您提供所需的输出。

这对特定输入有效,但如果您有类似
baz
的行,则无效。这就是请求:
我不知道如何排除除foo3之外的所有foo(例如使用-v)。
以及如何读取“例如”。你认为这是指“寻求独家途径”,还是在语法正确的“采取一种途径”的上下文中?或者你甚至不知道两者之间的区别吗?你还会有
foo33
,而仍然只喜欢
foo3
?因为这将打破大多数的解决方案张贴在这里。(包括我的)。谢谢。现在我正试图排除除“foo3”和“foo4”之外的所有foo,但不使用“|”和一个新的grep@uuuuv:
grep-v'^foo[^34]$”foo
,但这可能是一个不同的问题:-)在评论中询问的问题是,你的曝光率通常要低得多。如果不是“foo4”,我就排除了“foo48”和“foo9”。因为“[^34]”没有被解释为“34”。@uuv:我经常发现,如果需求变得更复杂,有时最好换一个不同的工具。大多数人认为,因为工具X可以做简单的Y,它也应该可以做复杂的Y——这并不总是一个好的假设。换言之,考虑使用
awk/perl
来增加功能。如果数字变大,这将打印
foo33
foo34
等。应该只打印
foo3
。OP不清楚是否会出现这种情况。
$ grep -vP '^(?!foo3)foo.*$' file
foo3
bar