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]
这将任何字符a
、n
、d
或]
识别为字符类的一部分。
对于否定字符类,]
必须是^
:之后的第一个字符
[^]and]
这会将除a
、n
、d
或]
之外的任何字符识别为字符类的一部分。
否则,[
之后的第一个]
标志着字符类的结束。在一个字符类中,大多数正则表达式的特殊字符都失去了它们的特殊含义,而其他字符(尤其是-
-minus)则获得了特殊含义。(如果要在字符类中使用-
,则它必须是"first"或"last",其中"first’表示"在可选的^
之后,并且仅当]
不存在时"。)
在您的示例中:
[^][()]
-这是一个否定的字符类,可以识别除[
、]
、(
或)
之外的任何字符,但是[^[]()]
——这是一个否定字符类,它可以识别除[
之外的任何字符,后面是您使用的正则表达式族中的任何()
符号,以及代表自身的]