1

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   

它行不通。

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

我想知道原因。

4

1 回答 1

2

进入角色类别的POSIX规则]有点神秘,但是当您仔细考虑时,它们是有道理的。

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

[]and]

这将任何字符an或识别为字符类的一部分d]

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

[^]and]

a这将识别除、或 之外的任何字符nd]作为字符类的一部分。

否则,第一个标记][的字符类结束。在一个字符类中,大多数普通的正则表达式特殊字符失去了它们的特殊含义,而其他的(尤其是-减号)获得了特殊的含义。(如果你想-在字符类中使用 a ,它必须是 'first' 或 last,其中 'first' 的意思是 '在可选之后^且仅当]它不存在时'。)

在您的示例中:

  • [^][()]— 这是一个否定字符类,可以识别除[,或, 以外的任何字符],但是()
  • [^[]()]- 这是一个否定字符类,它识别除 之外的任何字符[,后跟()您正在使用的正则表达式系列中的任何符号,并]代表它自己。
于 2013-02-17T05:07:40.853 回答