【问题标题】:Grep with "half"-exact matchGrep 与“一半”-完全匹配
【发布时间】:2010-12-03 17:34:30
【问题描述】:

我尝试使用 grep 来匹配这样的情况:

我有一个这样格式的主机名和 ips 列表:

238-456 192.168.1.1
ak238-456 192.168.1.2
238-456a 192.168.1.3
458-862 192.168.1.4

现在我尝试 grep "238-456" 但当然会返回:

238-456 192.168.1.1

还有……

ak238-456 192.168.1.2

还有……

238-456a 192.168.1.1

但我只需要正好是 238-456 的那一行。在这种情况下,我不能使用 -x 因为它当然不会返回任何结果。

有没有简单的方法来解决这个问题?

用“^”给出的答案解决了第一个问题。但不是以“a”结尾的那个。有人也可以帮忙吗?

【问题讨论】:

    标签: bash sed grep


    【解决方案1】:

    使用 awk

    awk '$1=="238-456"' file
    

    【讨论】:

      【解决方案2】:

      在此特定示例中,您可以搜索^238-456,它仅在所需文本出现在行首时匹配。如需更通用的解决方案,请了解正则表达式(这是一个示例)。

      编辑:

      对于您的新问题,您可以通过搜索"^238-456 " 手动添加一个空格。还有一些用于空格的正则表达式字符类。 "^238-456\>" 应该在这里工作。 \> 表示单词边界,您可能确实需要包含引号。另一个词边界是\<,因此您可以将整个内容更改为"\<238-456\>",这将消除对它位于行首的依赖。

      【讨论】:

      • 谢谢。奇迹般有效。但现在我发现最后带有“a”的条目。是否还有解决方案?我编辑了我的问题。
      【解决方案3】:

      你可以使用正则表达式:

      egrep "^238-456"
      

      应该做,要求从行首开始检查。

      这些正则表达式的教程示例可以在here找到。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-11
        • 1970-01-01
        • 2015-07-02
        • 2020-06-01
        • 2013-02-09
        • 1970-01-01
        • 2021-02-13
        相关资源
        最近更新 更多