为什么正则表达式中角色的顺序会影响sed?

时间:2013-02-17 04:59:56

标签: sed regex-group

tv.txt文件如下:

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   

它无法正常工作。

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

我想知道原因。

1 个答案:

答案 0 :(得分:2)

]加入角色类的POSIX规则有点神秘,但是当你仔细考虑它们时它们才有意义。

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

[]and]

这可识别任何字符and]作为字符类的一部分。

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

[^]and]

这可识别除and]之外的任何字符,作为字符类的一部分。

否则,]后面的第一个[标记字符类的结尾。在一个字符类中,大多数正常的正则表达式特殊字符都失去了它们的特殊含义,而其他字符(特别是-减去)则具有特殊含义。 (如果您想在字符类中使用-,则必须为“第一个”或最后一个,其中“第一个”表示“在可选^之后”且仅在]不存在时”)

在您的示例中:

  • [^][()] - 这是一个否定的字符类,可识别除[]()以外的任何字符,但
  • [^[]()] - 这是一个否定的字符类,可识别除[之外的任何字符,后跟您正在使用的正则表达式系列中的()符号,以及]它代表了自己。