[Ubuntu-zh] 脚本问题(小问题)

listofx listofx在gmail.com
星期四 六月 17 13:30:53 BST 2010


On 四, 2010-06-17 at 12:01 +0000, Jimmy Xu wrote:
> 2010/6/17 listofx <listofx在gmail.com>:
> > xiang在xiang-laptop:~/tmp$ cat a
> > python-gtk2-dev (2.17.0-0ubuntu2), libgladeui-1-9 (3.7.0.is.3.6.7-0ubuntu1), python-gtk2-doc (2.17.0-0ubuntu2)
> >
> > xiang在xiang-laptop:~/tmp$ cat a |sed 's/(.*)//g'
> > python-gtk2-dev
> >
> > xiang在xiang-laptop:~/tmp$ cat a |sed 's/.*//g'
> >
> >
> > xiang在xiang-laptop:~/tmp$ cat a |sed 's/\(.*\)//g'
> >
> >
> > xiang在xiang-laptop:~/tmp$
> > 谁能告诉我后面三个怎么理解。我的理解是
> > 1. cat a |sed 's/(.*)//g' 单引号屏蔽了shell对里面任何字符的解释,结果就
> > 是sed接收到s/(.*)//g的请求,我认为()在这里会被认为是括号,由sed解释,
> > 但是从上面的结果看,我的理解是错误的。
> >
> 
> 您的理解没错,这种结果的出现是因为 * 会尽可能多地匹配,所以导致从第一
> 个 ( 到最后一个 ) 全都被替换成了空串。
> 
> > 2. 第二个不解释
> >
> > 3. 从关于1的解释,其实sed 's/\(.*\)//g'的写法才是我想要的,因为我理解
> > shell将s/\(.*\)//g传给sed,sed自己在将转义字符\进行解释,结果就是查找以
> > 括号开始的一段文本(同时,以括号结束)。
> >
> 
> 可以试试 s/([^)]*)//g。
> 
> jimmy在jimmy:/tmp$ cat a |sed 's/([^)]*)//g'
> python-gtk2-dev , libgladeui-1-9 , python-gtk2-doc
> 

虽然邮件有点长,我觉得还是保留上面的内容接着写。我有两个疑问:
疑问一:
你最后的答复我能看明白,不过,不是说还有一种叫做懒惰匹配,也就是不将匹配
最大化,如果不熟悉,请看
http://deerchao.net/tutorials/regex/regex.htm#greedyandlazy

xiang在xiang-laptop:~/tmp$ cat a
python-gtk2-dev (2.17.0-0ubuntu2), libgladeui-1-9 (3.7.0.is.3.6.7-0ubuntu1), python-gtk2-doc (2.17.0-0ubuntu2)
xiang在xiang-laptop:~/tmp$ cat a | sed 's/(.*?)//g'
python-gtk2-dev (2.17.0-0ubuntu2), libgladeui-1-9 (3.7.0.is.3.6.7-0ubuntu1), python-gtk2-doc (2.17.0-0ubuntu2)

从结果可见,没有达到想要的效果

疑问二:
不理解cat a |sed 's/(.*)//g'为什么会匹配括号,因为按照我先前的解释,最终是将(.*)这样的正则表达式给了sed,而(在正则表达式中有其特殊含义,如果想要
匹配(,正确的正则表达式是\(.*\),不是吗?

谢谢!







关于邮件列表 ubuntu-zh 的更多信息