grep 正则表达式空格行为

115
我有一个文本文件,其内容类似于:
12,34 EUR 
 5,67 EUR
 ...

在“EUR”之前有一个空格,我忽略了0,XX欧元。

我尝试了:

grep '[1-9][0-9]*,[0-9]\{2\}\sEUR' => 没有匹配!

grep '[1-9][0-9]*,[0-9]\{2\} EUR' => 成功匹配!

grep '[1-9][0-9]*,[0-9]\{2\}\s*EUR' => 成功匹配!

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

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

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

1个回答

150
这似乎是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:]]或类似的东西。


28
或者只需使用 [:space:],例如:cat file | grep "[[:space:]]"。意思是在文件中查找任何空格字符。 - Kiril Kirov
根据这个错误请求http://www.mail-archive.com/bug-grep@gnu.org/msg02686.html,在较新版本的grep中似乎存在一个错误(另一种观点),但为什么最后一个语句匹配呢? - Milde
1
@Milde,注意后续帖子http://www.mail-archive.com/bug-grep@gnu.org/msg02689.html,其中该错误报告被标记为无效并关闭(因此在更新的grep中不被视为错误)。 - Kamal
2
@Milde,我查看过的所有grep文档(旧的或新的)实际上都没有提到\s。我会说它的行为是“未定义的”。请改用[:space:],它在旧版和新版grep中都有记录。 - Kamal
谢谢,我以后会使用[:space:]来避免这个问题。 - Milde
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接