用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