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 它不能工作。
唯一的区别是[^][()]和[^[]()];[^\[\]()]和转义字符都不能使其正常运行。
我想知道原因。
发布于 2013-02-17 13:07:41
将]放入字符类的POSIX规则有点晦涩难懂,但仔细想想就会明白。
对于正(非负)字符类,]必须是第一个字符:
[]and]这会将任何字符a、n、d或]识别为字符类的一部分。
对于被取反的字符类,]必须是^之后的第一个字符
[^]and]这会将除a、n、d或]之外的任何字符识别为character类的一部分。
否则,[之后的第一个]将标记字符类的结束。在字符类中,大多数普通的正则表达式特殊字符失去了它们的特殊含义,而其他字符(特别是-减号)获得了特殊含义。(如果需要字符类中的-,它必须是“first”或“last”,其中“first”表示“在可选^之后,且仅当]不存在时”。)
在您的示例中:
[^][()] -这是一个可识别除[,],(或),but[^[]()]之外的任何字符的求反字符类-这是一个可识别除[之外的任何字符的求反字符类,后面是您正在使用的正则表达式家族中的任何()符号,以及代表其自身的]。https://stackoverflow.com/questions/14918132
复制相似问题