我有一个文件,其内容类似于以下文件。
0
0
0.2
0
0
0
0
我需要用一个零删除所有行。
我正在考虑使用grep -v "0"
,但这也删除了包含 0.2 的行。我看到我可以使用该-w
选项,但这似乎也不起作用。
如何删除仅包含一个 0 的所有行并保留所有以 0 开头的行?
我有一个文件,其内容类似于以下文件。
0
0
0.2
0
0
0
0
我需要用一个零删除所有行。
我正在考虑使用grep -v "0"
,但这也删除了包含 0.2 的行。我看到我可以使用该-w
选项,但这似乎也不起作用。
如何删除仅包含一个 0 的所有行并保留所有以 0 开头的行?
来自
man grep
:-w
失败是因为第一个被认为0
是0.02
一个“单词”,因此这一行是匹配的。这是因为它后面跟着一个“非单词”字符。如果您在没有-v
,的情况下运行原始命令,您可以看到这一点grep -w "0"
。使用 grep:
^
表示行首,$
表示行尾。虽然
grep
可以用于此(正如其他答案清楚地表明),但让我们退后一步,想想你真正想要什么:正则表达式解释字符序列数据。他们不知道数字,只知道单个数字(及其常规组合)。尽管在您的特定情况下,围绕此限制有一个简单的破解,但它最终是需求不匹配。
除非有很好的理由在
grep
这里使用(例如,因为您已经测量过它,而且它的效率要高得多,而且效率对您而言至关重要),否则我建议使用不同的工具。awk
,例如,可以根据数值比较进行过滤,例如:而且,要获取所有包含大于零的数字的行:
我喜欢正则表达式,它是一个很棒的工具。但这不是唯一的工具。俗话说,如果你只有
grep
,一切看起来都像一门普通的语言。grep
's-w
有点令人费解,它将原始字符串拆分为单词和非单词成分(除了字母、数字或下划线之外的任何内容)。因为它已经遇到了一个有效的单词成分0
,0.02
所以它断言否定逻辑来删除该行。在这种情况下使用
sed
有点容易删除匹配的整个单词当您要删除的行仅包含a
0
后跟下一行时,您可以通过发出以下命令来选择这些行:这只会同时打印出现
0
在行尾和行首的那些。然后该-v
选项反转我们的选择。\b
- 字边框匹配行首、您的模式和行尾
或@Sparhawk 建议
-vx
的 lineregexp请注意,这
-w
可行,但在您的情况下0.2
是两个单词,因为点字符是单词分隔符。另一个答案是为了多样化,假设您启用了 PCRE
grep
这将执行负前瞻以匹配以点开头
0
且后面不跟点的行。然后-v
丢弃不匹配的行。您可以在此处查看实际操作假设任何不只是单个 0 的行都有一个句点
grep '\.' file