我有一个文件,其内容类似于以下文件。
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
失败是因为第一个0
in0.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
选项会反转我们的选择。