[shell] grep里的星号(*)和双引号(“)
小心使用grep里的星号(*)
grep "/home/.*test"
上面这句是找出所有/home目录下,以test结尾的文件
grep "/home/*test"
这句可就不是了,这句grep只匹配以下的文件名:
/hometest
/home/test
/home//test
/home///test
看明白了,星号(*)代表重复其前面的字符任意次(包括零),而“/*“当然就表示重复”/”任意次。
另外注意grep后面的正则表达式务必加上双引号,如果不加,在一些特殊场合会有完全不同的含义。
比如我当前目录下有六个文件:
testa
testb
testc
testd
tt
t
运行:
ls -l|grep t*t
它会把这五个文件都列出来吗?不,结果显示只找到了文件tt
因为上面的shell命令,grep实际上是在找以t开头且以t结尾的文件(这一规则和ls的规则一样)
要想grep把后面的”t*t”当成正则表达式,需要加上双引号:
ls -l|grep "t*t"
这下结果ok了:所有六个文件都可以被找到。
相关文章
- fedora 9 小集 - 01 05, 2009
- 多线程调试 - 12 17, 2008
- fedora 9 试用 - 12 05, 2008
吹毛求疵一下:)
grep t*t是先做了shell展开,在当前路径下作匹配. 在你给的例子里面ls -l | grep t*t 等同于ls -l | grep tt
加了引号的不叫做正则, 称为pattern,grep -P 的选项是使用的正则表达式...
你的解释应该是正解。
受教了。
grep -P是使用Perl的正则表达式,ls -l|grep t*t 里的*应该是Shell的通配符(wildchar),而不是正则表达式里*的意思
受教