日期:2014-05-16  浏览次数:20569 次

关于通配符和正则表达式
“ * ”这个符号,在被当做通配符时和被当做正则表达式的时候的解释是完全不同的。那么当我使用一个支持正则表达式的程序时,用到了*号,那它默认会被认为是通配符还是正则表达式?如果默认为正则表达式的话,就相当于支持正则表达式的程序都不支持通配符了?这样的话,在我想要使用通配符的时候,还得要提前看看我使用的程序是不是支持正则表达式,如果确认不支持才能用通配符?

------解决方案--------------------
”默认为正则表达式的话,就相当于支持正则表达式的程序都不支持通配符“是这样的。
Regular Expressions
 r* matches zero or more r's.
正则表达式中不支持通配符,要达到通配符的效果可以使用”.*“。


------解决方案--------------------
wildcard 只用于shell的cmd line 的path 参数(目录名,文件名);
对于非shell的应用而言,没有wildcard的概念;

那么当我使用一个支持正则表达式的程序时,用到了*号,那它默认会被认为是通配符还是正则表达式?
若非shell应用,*会被认为是正则表达式;
若为shell,并且* 在路径参数什么,shell做解释;否则,shell不对其进行处理,直接传给进程;

如果默认为正则表达式的话,就相当于支持正则表达式的程序都不支持通配符了?
感觉应该区分上下文;
显然shell时支持正则表达式的,也是支持通配符的;

这样的话,在我想要使用通配符的时候,还得要提前看看我使用的程序是不是支持正则表达式,如果确认不支持才能用通配符?
shell会自动区分;
其他非shell只支持正则表达式;

不是非常确定




------解决方案--------------------
shell只支持通配符。

你使用的awk, sed, egrep支持正则表达式, 它们是独立的程序, 只不过设置了PATH环境变量并放置到/usr下, 于是你感觉像shell命令一样. 你只是借助shell运行这些程序, 传入命令行参数(正则表达式)而已.

linux下C库支持POSIX标准正则,所以一般的linux工具都是POSIX标准的,而不是PERL标准的。如果需要开发自己的正则程序,可以使用regex.h这个系列的POSIX正则接口。

另外,shell执行一个程序时,shell会先对你的命令进行一次过滤,所以需要注意你命令行传入的正则表达式是否会被转移,当使用"时通常你需要做更多的转移工作,当使用'时便不会那么麻烦了. 但有时候我们又希望''内使用shell变量, 但这又是不现实的, 所以必须使用"外加一些额外的转移工作保证正则表达式传入到程序时保持原样.