AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 500549
Accepted
Philip Kirkbride
Philip Kirkbride
Asked: 2019-02-14 23:11:16 +0800 CST2019-02-14 23:11:16 +0800 CST 2019-02-14 23:11:16 +0800 CST

Grep 删除 0 但不是 0.2 的行?

  • 772

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

0
0
0.2
0
0
0
0

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

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

grep
  • 8 8 个回答
  • 6633 Views

8 个回答

  • Voted
  1. Best Answer
    Sparhawk
    2019-02-14T23:19:44+08:002019-02-14T23:19:44+08:00
    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是0.02一个“单词”,因此这一行是匹配的。这是因为它后面跟着一个“非单词”字符。如果您在没有-v,的情况下运行原始命令,您可以看到这一点grep -w "0"。

    • 38
  2. Arkadiusz Drabczyk
    2019-02-14T23:20:40+08:002019-02-14T23:20:40+08:00

    使用 grep:

    grep -v '^0$' file
    

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

    • 30
  3. Konrad Rudolph
    2019-02-15T03:18:34+08:002019-02-15T03:18:34+08:00

    虽然grep 可以用于此(正如其他答案清楚地表明),但让我们退后一步,想想你真正想要什么:

    • 您有一个包含数字的文件
    • 您想根据数值执行过滤。

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

    除非有很好的理由在grep这里使用(例如,因为您已经测量过它,而且它的效率要高得多,而且效率对您而言至关重要),否则我建议使用不同的工具。

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

    awk '$1 == 0' your_file
    

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

    awk '$1 > 0' your_file
    

    我喜欢正则表达式,它是一个很棒的工具。但这不是唯一的工具。俗话说,如果你只有grep,一切看起来都像一门普通的语言。

    • 14
  4. Inian
    2019-02-14T23:34:58+08:002019-02-14T23:34:58+08:00

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

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

    sed '/^0$/d' file
    
    • 6
  5. majesticLSD
    2019-02-14T23:35:16+08:002019-02-14T23:35:16+08:00

    当您要删除的行仅包含a0 后跟下一行时,您可以通过发出以下命令来选择这些行:

    grep -v "^0$"
    

    这只会同时打印出现0在行尾和行首的那些。然后该-v选项反转我们的选择。

    • 4
  6. Jakub Jindra
    2019-02-14T23:23:51+08:002019-02-14T23:23:51+08:00
    • \b- 字边框

      grep -v "\b0\b"
      
    • 匹配行首、您的模式和行尾

      grep -v "^0$"
      
    • 或@Sparhawk 建议-vx的 lineregexp

    请注意,这-w可行,但在您的情况下0.2是两个单词,因为点字符是单词分隔符。

    • 0
  7. mrbolichi
    2019-02-15T02:01:57+08:002019-02-15T02:01:57+08:00

    另一个答案是为了多样化,假设您启用了 PCREgrep

    grep -Pv "^0(?!\.)"
    

    这将执行负前瞻以匹配以点开头0且后面不跟点的行。然后-v丢弃不匹配的行。您可以在此处查看实际操作

    • 0
  8. Roger Mungo
    2019-02-17T01:12:43+08:002019-02-17T01:12:43+08:00

    假设任何不只是单个 0 的行都有一个句点

    grep '\.' file

    • 0

相关问题

  • 来自 `service | 的意外结果 grep`

  • 读取带有单词的文本文件及其出现次数和排序的打印输出

  • 命令 ls | grep 只显示目录(当它也应该显示文件时)

  • grep 什么时候计数,什么时候不计数

  • grep --line-buffered 直到 X 行?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve