【问题标题】:grep to find literal [square brackets] with specific datagrep 查找具有特定数据的文字 [方括号]
【发布时间】:2021-09-19 07:31:03
【问题描述】:

我的文件包含以下几行:

hello_400 [200]
world_678 [201]
this [301]
is [302]
your [200]
friendly_103 [404]
utility [200]
grep [200]

我只寻找以[200] 结尾的行。我确实尝试使用以下模式转义方括号:

  • cat file | grep \[200\]
  • cat file | grep \\[200\\]$

结果要么包含所有行,要么不包含任何内容。这很混乱。

【问题讨论】:

  • 您的最后一个命令 cat file | grep \\[200\\]$ 应该与 shbashdash 一起使用。

标签: regex unix awk grep pcregrep


【解决方案1】:

我建议转义 [] 并用单引号引用完整的正则表达式,以防止您的 shell 解释正则表达式。

grep '\[200\]$' file

输出:

你好_400 [200] 你的 [200] 实用程序 [200] grep [200]

【讨论】:

    【解决方案2】:

    除非您出于某种原因(例如文件名扩展)需要删除引号,否则请始终在 shell 中的字符串周围使用引号,请参阅 https://mywiki.wooledge.org/Quotes,因此默认情况下使用 grep 'foo' 而不是 grep foo。然后,您只需转义字符串中的 [ 正则表达式元字符以使其成为文字,即 grep '\[200]' file

    与其使用 grep 并且必须转义正则表达式元字符以使它们表现为文字,只需使用支持对特定字段进行文字字符串比较的 awk:

    $ awk '$NF=="[200]"' file
    hello_400 [200]
    your [200]
    utility [200]
    grep [200]
    

    或全线:

    $ awk 'index($0,"[200]")' file
    hello_400 [200]
    your [200]
    utility [200]
    grep [200]
    

    【讨论】:

    • 天才!谢谢埃德。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2016-05-25
    • 1970-01-01
    • 2017-01-17
    • 2017-12-09
    • 1970-01-01
    相关资源
    最近更新 更多