2013-02-17 17 views
1

的tv.txt文件如下:为什么字符在正则表达式中的顺序会影响sed?

mms://live21.gztv.com/gztv_gz 广州台[可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3] 
mms://live21.gztv.com/gztv_news 广州新闻台·直播广州(可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3) 
mms://live21.gztv.com/gztv_kids 广州少儿台(可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3) 
mms://live21.gztv.com/gztv_econ 广州经济台 

我想这组分成三组。

sed -r 's/([^ ]*)\s([^][()]*)((\(.+\))*|(\[.+\])*)/\3/' tv.txt 

得到了结果:

[可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3]  
(可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3)  
(可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3) 

当我把它写到

sed -r 's/([^ ]*)\s([^][()]*)((\(.+\))*|(\[.+\])*)/\3/' tv.txt 

它不能正常工作。

唯一的区别是[^][()][^[]()]; [^\[\]()],转义字符都不能使其正常运行。

我想知道原因。

回答

2

POSIX]变成一个字符类的规则有点神秘,但是当你很难想象它们时它们是有意义的。

对于正(非否定)字符类,则]必须是第一个字符:

[]and] 

这就承认任何字符and]作为字符类的一部分。

对于否定的字符类,则]必须是^后的第一个字符:

[^]and] 

此识别的任何字符以外and]作为字符类的一部分。

否则,在[之后的第一个]标志了字符类的结束。在角色类中,大部分正常的正则表达式特殊字符失去其特殊含义,其他字符(特别是-减去)具有特殊含义。 (如果你想在一个字符类-,它必须是“第一”或最后一个,其中“第一”的意思是“可选^且仅当]后不存在”。)

在你的例子:

  • [^][()] - 这是一个否定的字符类,承认除[](),但
  • [^[]()]任何字符 - 这是承认除任何字符否定字符类210,然后是任何()在您正在使用的正则表达式系列中的符号,以及代表自身的]
相关问题