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



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   

它不起作用。

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

我想知道原因。

]放入字符类的POSIX规则有点晦涩难懂,但仔细想想,它们是有意义的。

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

[]and]

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

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

[^]and]

这会将除and]之外的任何字符识别为字符类的一部分。

否则,[之后的第一个]标志着字符类的结束。在一个字符类中,大多数正则表达式的特殊字符都失去了它们的特殊含义,而其他字符(尤其是--minus)则获得了特殊含义。(如果要在字符类中使用-,则它必须是"first"或"last",其中"first’表示"在可选的^之后,并且仅当]不存在时"。)

在您的示例中:

  • [^][()]-这是一个否定的字符类,可以识别除[]()之外的任何字符,但是
  • [^[]()]——这是一个否定字符类,它可以识别除[之外的任何字符,后面是您使用的正则表达式族中的任何()符号,以及代表自身的]

最新更新