【问题标题】:grep regex whitespace behaviorgrep 正则表达式空格行为
【发布时间】:2011-05-13 02:25:19
【问题描述】:

我有一个文本文件,包含如下内容:

12,34 EUR 
 5,67 EUR
 ...

'EUR' 前有一个空格,我忽略 0,XX EUR。

我试过了:

grep '[1-9][0-9]*,[0-9]\{2\}\sEUR' => didn't match !

grep '[1-9][0-9]*,[0-9]\{2\} EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s*EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s[E]UR' => worked !

有人能解释一下吗,为什么我不能使用\s\s*\s[E] 匹配?

操作系统:Ubuntu 10.04,grep v2.5

【问题讨论】:

    标签: regex grep gnu


    【解决方案1】:

    这看起来像是 grep 2.5 和更新版本之间处理 \s 的行为差异(旧 grep 中的错误?)。我用 grep 2.5.4 确认了您的结果,但是在使用 grep 2.6.3 (Ubuntu 10.10) 时,所有四个 grep 都可以工作。

    注意:

    GNU grep 2.5.4
    echo "foo bar" | grep "\s"
       (doesn't match)
    

    GNU grep 2.6.3
    echo "foo bar" | grep "\s"
    foo bar
    

    可能麻烦更少(因为\s 没有记录):

    Both GNU greps
    echo "foo bar" | grep "[[:space:]]"
    foo bar
    

    我的建议是避免使用\s ...改用[ \t]*[[:space:]] 或类似的东西。

    【讨论】:

    • 或者只是[:space:],例如。像这样:cat file | grep "[[:space:]]"
    • 根据这个bug请求mail-archive.com/bug-grep@gnu.org/msg02686.html看来是新版grep的bug(其他观点)但是为什么最后一条语句匹配?
    • @Milde,请注意后续帖子 mail-archive.com/bug-grep@gnu.org/msg02689.html,该错误报告被标记为无效并已关闭(因此这不被视为新 grep 中的错误)。
    • @Milde,我检查过的所有 grep 文档(旧的或新的)实际上都没有提到 \s。我会说它的行为是“未定义的”。请改用 [:space:],它的工作原理与旧 grep 和新 grep 中记录的一样。
    • 谢谢,以后我会用[:space:]来避免这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多