Chinaunix
标题:
在shell命令行下怎么用正则表达式?
[打印本页]
作者:
borefo
时间:
2010-08-02 09:15
标题:
在shell命令行下怎么用正则表达式?
我想看/dev/目录下所有的tty文件,我这么写
ls -l /dev/tty[0-9]+
复制代码
报?bin/ls: /dev/tty[0-9]+: No such file or directory
为什么不行?
而
ls -l /dev/tty[0-9]*
复制代码
就可以。
在shell命令行下怎么用正则表达式,也就是用第一种方式?
作者:
blackold
时间:
2010-08-02 09:22
回复
1#
borefo
这问题问得……
路径匹配不是使用正则(至少不是普通的正则),而是wildcard。
作者:
borefo
时间:
2010-08-02 09:24
回复
2#
blackold
在路径匹配中可以用正则表达式么?如果可以该怎么用呢?
作者:
Shell_HAT
时间:
2010-08-02 09:24
ls -l /dev/ | grep -E 'tty[0-9]+'
复制代码
作者:
Shell_HAT
时间:
2010-08-02 09:25
回复
3#
borefo
不可以直接用。需要借助其它命令。
作者:
borefo
时间:
2010-08-02 09:32
回复
5#
Shell_HAT
通配符和正则表达式,我老是搞混淆,什么情况下是通配符,什么情况下是正则表达式呢?谢谢
作者:
blackold
时间:
2010-08-02 09:40
本帖最后由 blackold 于 2010-08-02 09:46 编辑
回复
6#
borefo
这个问题可不好回答,该用正则的地方就用正则,该用通配符的地方就用通配符——废话。
可用文件名的地方使用通配符,正则应该使用正则的地方(还是废话)用正则——这要看相关命令的文档。
为什么 grep 'foo.*bar' ...中的foo.*bar当作正则解释?因为grep语法就是这样定的。
根据bash man,如果出现未引用的通配符,那么shell就进行路径展开(就是通配符匹配):
如grep foo.*bar ... 中的通配符没有引用,那么shell会对foo.*bar进行通配符解释,展开的结果也当前目录的文件有关,如果当前目录存在文件:
foo.bar foo.abcbar,那么展开结果为:
grep foo.bar foo.abcbar ...
说起来很啰嗦。
作者:
borefo
时间:
2010-08-02 09:49
回复
7#
blackold
什么是“grep foo.*bar ... 中的通配符没有引用”这句话没能理解。
作者:
blackold
时间:
2010-08-02 09:49
通配符是由shell来解释的,而正则是由命令, 如grep,来解释的——有的shell也可以解释正则,如=~操作符。
先进行通配符解释,后进行正则解释。至于其中细节,就要看man了。
作者:
blackold
时间:
2010-08-02 09:52
本帖最后由 blackold 于 2010-08-02 09:57 编辑
回复
8#
borefo
看来你还没了解引用。先看shell基础吧。
foo.\*bar
foo.'*'bar
foo."*"bar
上面这几个*都是被引用了。
作者:
borefo
时间:
2010-08-02 09:57
echo y0y | sed 's/^[a-z]\+[0-9]\+[a-z]\+//g'
复制代码
上面的sed是用的正则表达式,“+”本来就是正则表达式的元字符,为什么还要转义呢?
作者:
blackold
时间:
2010-08-02 10:00
回复
11#
borefo
正则又有BRE和ERE之分,在BRE中+只是字面字符,\+才是特殊的。
作者:
blackold
时间:
2010-08-02 10:02
在没有-r选项的情况下,sed支持的是BRE(基本正则),所以要用\+表示前导字符的一次或多于一次的出现。
用-r就后,就要使用+,而不能使用\+了。
作者:
howge
时间:
2010-08-02 10:10
学习了
作者:
jiwang1980
时间:
2010-08-02 10:15
学习了,,,,
作者:
yybmsrs
时间:
2010-08-02 10:40
学习了
作者:
jayliud
时间:
2010-08-02 23:33
黑哥一席话,揭开我胸中对Linux命令中正则使用的无限困惑
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2