grep 删除带有 0 的行而不是 0.2?

grep 删除带有 0 的行而不是 0.2?

我有一个文件,其内容类似于以下文件。

0
0
0.2
0
0
0
0

我需要删除所有带有一个零的行。
我想使用grep -v "0",但这也删除了包含 0.2 的行。我看到我可以使用该-w选项,但这似乎也不起作用。

如何删除仅包含一个 0 的所有行并保留所有以 0 开头的行?

答案1

grep -vx 0

man grep

-x, --line-regexp
       Select only those matches that exactly match the whole line.
       For a regular expression pattern, this is like parenthesizing
       the pattern and then surrounding it with ^ and $.

-w失败是因为第一个0in0.02被认为是一个“单词”,因此这一行是匹配的。这是因为它后面跟着一个“非单词”字符。如果您运行不带-v, ie 的原始命令,您可以看到这一点grep -w "0"

答案2

使用 grep:

grep -v '^0$' file

^表示行首,$表示行尾。

答案3

尽管grep 用于此目的(正如其他答案清楚地表明的那样),让我们退一步思考一下您真正想要的:

  • 你有一个文件包含数字
  • 您想要根据以下内容执行过滤数值

正则表达式解释字符序列数据。他们不了解数字,只了解单个数字(及其常规组合)。尽管在您的特定情况下,有一个简单的方法可以解决此限制,但最终是需求不匹配。

除非有充分的理由grep在这里使用(例如,因为您已经测量过它,并且它的效率大大提高,并且效率在您的情况下至关重要),否则我建议使用不同的工具。

awk例如,可以根据数字比较进行过滤,例如:

awk '$1 == 0' your_file

而且,要获取包含大于零的数字的所有行:

awk '$1 > 0' your_file

我喜欢正则表达式,它是一个很棒的工具。但这不是仅有的工具。俗话说,如果你拥有的只是grep,那么一切看起来都像常规语言。

答案4

当您要删除的行只包含A0 接下来是下一行您可以通过发出以下命令来选择这些行:

grep -v "^0$"

这只会打印出现的0情况在一行的末尾在一行的开头同时。然后该-v选项会反转我们的选择。

相关内容