grep regex空格行为


87

我有一个文本文件,其中包含以下内容:

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

Answers:


122

这似乎\s在grep 2.5与较新版本(旧grep中的错误?)之间的处理上存在行为差异。我用grep 2.5.4确认了您的结果,但是使用grep 2.6.3(Ubuntu 10.10)时,您的所有四个抓钩都可以使用。

注意:

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:]]或类似的东西来代替。


24
或者只是[:space:],例如。像这样:cat file | grep "[[:space:]]"
Kiril Kirov

根据此bug要求mail-archive.com/bug-grep@gnu.org/msg02686.html,这似乎是较新版本的grep(其他观点)中的bug,但是为什么最后一条语句匹配?
米尔德

1
@Milde,请注意后续邮件mail-archive.com/bug-grep@gnu.org/msg02689.html,该错误报告被标记为无效并已关闭(因此,这不视为较新grep中的错误)。
卡马尔

2
@Milde,我所检查的grep文档(旧的或新的)均未涉及\s。我会说它的行为是“未定义的”。请改用[:space:],其作用如新旧grep所述。
卡马尔

谢谢,我将来会使用[:space:]来避免问题
Milde 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.