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
它无法正常工作。
唯一的区别是[^][()]
和[^[]()]
; [^\[\]()]
,转义字符都不能使其正常运行。
我想知道原因。
答案 0 :(得分:2)
将]
加入角色类的POSIX规则有点神秘,但是当你仔细考虑它们时它们才有意义。
对于正(非否定)字符类,]
必须是第一个字符:
[]and]
这可识别任何字符a
,n
,d
或]
作为字符类的一部分。
对于否定的字符类,]
必须是^
之后的第一个字符:
[^]and]
这可识别除a
,n
,d
或]
之外的任何字符,作为字符类的一部分。
否则,]
后面的第一个[
标记字符类的结尾。在一个字符类中,大多数正常的正则表达式特殊字符都失去了它们的特殊含义,而其他字符(特别是-
减去)则具有特殊含义。 (如果您想在字符类中使用-
,则必须为“第一个”或最后一个,其中“第一个”表示“在可选^
之后”且仅在]
不存在时”)
在您的示例中:
[^][()]
- 这是一个否定的字符类,可识别除[
,]
,(
或)
以外的任何字符,但[^[]()]
- 这是一个否定的字符类,可识别除[
之外的任何字符,后跟您正在使用的正则表达式系列中的()
符号,以及]
它代表了自己。