正则表达式: \s 要慎用
时间:2010-02-24 来源:myst
匹配空白(space与tab)的标准写法是 [ \t],当然也有其它的写法,[ \t]算是最简单、最流行的写法了,还一种很不可靠的写法\s ,虽然它在很多时候也能匹配space与tab,与[ \t]的功能似乎相同,而且形式更为简略,但是这个\s一定要慎用,能不用就不用,因为有大大的bug,举例说明 :
文本文件data_file的数据如下:
/bin/basename /bin/cat /bin/chgrp
/bin/chmod /bin/chown /bin/cp
/bin/cut /bin/date /bin/dd
/bin/df /bin/echo /bin/env
/bin/expr /bin/false /bin/id
/usr/bin/csplit /usr/bin/cut /usr/bin/dir
/usr/bin/dircolors /usr/bin/dirname /usr/bin/du
/usr/bin/env /usr/bin/expand /usr/bin/expr
/usr/sbin/chroot
现在要把目录名去掉,只留下后面的可执行文件名称:
# sed -r 's/[^ \t]+bin\///g' data_file 这样是可行的
# sed -r 's/[^\s]+bin\///g' data_file 这样不可行 !
sed版本是4.2,曾经很疑惑为什么\s如此简单的写法却经常被排除在主流用法之外,原来如此。
通过上面的那个例子,我还发现了sed-4.2 正则的其它的bug,当tab符号单独使用的时候,方括号里加上^排除法,即[^\t] ,也会出现错误,但本人很忙,没空去报告。
文本文件data_file的数据如下:
/bin/basename /bin/cat /bin/chgrp
/bin/chmod /bin/chown /bin/cp
/bin/cut /bin/date /bin/dd
/bin/df /bin/echo /bin/env
/bin/expr /bin/false /bin/id
/usr/bin/csplit /usr/bin/cut /usr/bin/dir
/usr/bin/dircolors /usr/bin/dirname /usr/bin/du
/usr/bin/env /usr/bin/expand /usr/bin/expr
/usr/sbin/chroot
现在要把目录名去掉,只留下后面的可执行文件名称:
# sed -r 's/[^ \t]+bin\///g' data_file 这样是可行的
# sed -r 's/[^\s]+bin\///g' data_file 这样不可行 !
sed版本是4.2,曾经很疑惑为什么\s如此简单的写法却经常被排除在主流用法之外,原来如此。
通过上面的那个例子,我还发现了sed-4.2 正则的其它的bug,当tab符号单独使用的时候,方括号里加上^排除法,即[^\t] ,也会出现错误,但本人很忙,没空去报告。
相关阅读 更多 +