我有一个文件,其内容类似于以下文件。
0
0
0.2
0
0
0
0
Run Code Online (Sandbox Code Playgroud)
我需要用一个零删除所有行。
我想使用grep -v "0"
,但这也删除了包含 0.2 的行。我看到我可以使用该-w
选项,但这似乎也不起作用。
如何删除仅包含单个 0 的所有行并保留所有这些行以 0 开头?
Spa*_*awk 35
grep -vx 0
Run Code Online (Sandbox Code Playgroud)
来自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 $.
Run Code Online (Sandbox Code Playgroud)
-w
失败,因为 first 0
in0.02
被认为是一个“单词”,因此该行被匹配。这是因为它后面跟着一个“非单词”字符。如果不带-v
,即运行原始命令,您可以看到这一点grep -w "0"
。
Ark*_*zyk 28
使用 grep:
grep -v "^0$" file
Run Code Online (Sandbox Code Playgroud)
^
表示行首,$
表示行尾。
Kon*_*lph 14
虽然grep
可以用于此(如其他答案清楚显示),让我们退后一步,想想你真正想要什么:
正则表达式解释字符序列数据。他们不知道数字,只知道单个数字(及其常规组合)。尽管在您的特定情况下有一个简单的方法可以解决此限制,但最终是需求不匹配。
除非有很好的理由在grep
这里使用(例如,因为您已经对其进行了测量,而且它的效率要高得多,而且效率对您的情况至关重要),否则我建议使用不同的工具。
awk
,例如,可以根据数字比较进行过滤,例如:
awk '$1 == 0' your_file
Run Code Online (Sandbox Code Playgroud)
而且,要获取包含大于零的数字的所有行:
awk '$1 > 0' your_file
Run Code Online (Sandbox Code Playgroud)
我喜欢正则表达式,它是一个很棒的工具。但这不是唯一的工具。俗话说,如果你只有grep
,一切看起来都像一门常规语言。
grep
's-w
有点复杂,它将原始字符串拆分为单词和非单词成分(除了字母、数字或下划线之外的任何内容)。因为它已经遇到了一个有效的词成分0
,0.02
所以它断言了否定逻辑以删除该行。
sed
在这种情况下使用有点容易,只需删除匹配的整个单词
sed '/^0$/d' file
Run Code Online (Sandbox Code Playgroud)