【问题标题】:Odd grep behavior奇怪的 grep 行为
【发布时间】:2012-10-19 18:54:45
【问题描述】:

this 问题的启发,谁能解释以下行为?

$ 回声“-uus” | grep -wo '[0]*' && echo 匹配 -uus 匹配的 $ 回声“-uus” | grep -o '[0]*' && 回显匹配 匹配的 $ grep --version | sed 1q grep (GNU grep) 2.5.1

特别是,为什么第二个 grep 成功了,但是没有输出?为什么第一个命令有两行输出?输出的第二行我能看懂,但第一行看不懂。

【问题讨论】:

  • 在这两种情况下我都只得到matchedsprunge.us/RTfM
  • 你确定你没有创建一个名为grep 的别名或shell 函数(大概调用真正的grep)?你的环境中有GREP_OPTIONS吗?
  • 我可以在几个 shell 下重现 OP 的输出,即 OS X 上的 grep 2.5.1(没有定义 GREP_OPTIONS。)
  • 这发生在 OS X (10.8.0) 上,grep 是 /usr/bin/grep,未定义 GREP_OPTIONS。我无法理解操作系统的重要性。
  • @WilliamPursell:是的,这是我多年前发现的错误。较新版本的 grep 不应出现此类行为。

标签: bash grep


【解决方案1】:

grep 的旧版本中存在错误。我在这里报告了一个:

https://bugzilla.redhat.com/show_bug.cgi?id=144980

grep 的较新版本不再出现此问题。

【讨论】:

    【解决方案2】:

    问题:为什么grep成功了,却没有输出?

    $ echo "-uus" | grep -o '[0]*' && echo matched
    matched
    

    答案:

    模式[0]* 表示至少零个字符。所以grep 说它找到了,即使匹配的文本是空的。 grep 与选项 -o 一起使用不会打印空匹配字符串。 man 页面说:

    -o, --only-matching
    仅打印匹配行的匹配(非空)部分,每个这样的部分在单独的输出行上。

    你甚至可以使用空模式,它的输出是一样的:

    $ echo "-uus" | grep -o '' && echo matched 
    matched
    

    你也可以测试:

    $ echo    | grep -o '' && echo matched || echo unmatched
    matched
    $ echo -n | grep -o '' && echo matched || echo unmatched
    unmatched
    

    但是,当不使用选项 -o 时,grep 甚至会打印空行:

    $ echo    | grep '' && echo matched || echo unmatched
    
    matched
    


    问题:为什么第一条命令有两行输出?

    $ echo "-uus" | grep -wo '[0]*' && echo matched
    -uus
    
    matched
    $ grep --version | sed 1q
    grep (GNU grep) 2.5.1
    

    答案:

    看起来像 GNU grep 2.5.1 中的一个错误

    【讨论】:

    • 是的,但是如果grep用-o匹配空字符串,它似乎应该输出一个空行而不是什么。
    • 我同意 echo | grep '' 打印一个空行。而不是echo | grep -o '' 什么都不打印。但这是正确的:选项-o 不打印空匹配字符串。谢谢你指出这一点。我更新我的答案。干杯;-)
    • 嗨@WilliamPursell。感谢您的评论=>我已经更新了我的答案。我希望这种奇怪的grep 行为现在对你来说是清楚的;-) 再见。干杯。
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2021-07-04
    • 2018-11-22
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    相关资源
    最近更新 更多