Grep 删除带有 0 但不是 0.2 的行?

Phi*_*ide 12 grep

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

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 0in0.02被认为是一个“单词”,因此该行被匹配。这是因为它后面跟着一个“非单词”字符。如果不带-v,即运行原始命令,您可以看到这一点grep -w "0"

  • RegEx 引擎可能使用得如此频繁和广泛,以至于他们已经实现了它的一个非常有效的版本,但是“普通搜索”可能已经 30 年没有升级了。 (2认同)

Ark*_*zyk 28

使用 grep:

grep -v "^0$" file
Run Code Online (Sandbox Code Playgroud)

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

  • 这就是用户要求的:避免任何仅包含 1 个“0”的行。 (2认同)

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,一切看起来都像一门常规语言。

  • 我完全同意 awk 在这里可能更优雅……但是,它也可能比用户期望的多一点(每个数值都为 0)。即,`printf '0\n1\n-1\na\nb\n0\n0 也\n0.0\n-0.0\n0*0\n' | awk '($1 == 0)'` 将匹配:`0`、`0.0` 和 `-0.0`... 还有 `0 也`!不只是“0”。(有时需要,有时不需要)。如果用户只想要“0”:`awk '/^0$/'`(或 `grep '^0$'`)。您还应该编辑:用户需要添加 `!` 来否定测试,因此它隐藏了 `0`(和其他零)并显示其余部分。即:`awk '!( $0 == 0)'` (3认同)

Ini*_*ian 5

grep's-w有点复杂,它将原始字符串拆分为单词和非单词成分(除了字母、数字或下划线之外的任何内容)。因为它已经遇到了一个有效的词成分00.02所以它断言了否定逻辑以删除该行。

sed在这种情况下使用有点容易,只需删除匹配的整个单词

sed '/^0$/d' file
Run Code Online (Sandbox Code Playgroud)