2013-02-17 30 views
1

的tv.txt文件如下:爲什麼字符在正則表達式中的順序會影響sed?

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 

它不能正常工作。

唯一的區別是[^][()][^[]()]; [^\[\]()],轉義字符都不能使其正常運行。

我想知道原因。

回答

2

POSIX]變成一個字符類的規則有點神祕,但是當你很難想象它們時它們是有意義的。

對於正(非否定)字符類,則]必須是第一個字符:

[]and] 

這就承認任何字符and]作爲字符類的一部分。

對於否定的字符類,則]必須是^後的第一個字符:

[^]and] 

此識別的任何字符以外and]作爲字符類的一部分。

否則,在[之後的第一個]標誌了字符類的結束。在角色類中,大部分正常的正則表達式特殊字符失去其特殊含義,其他字符(特別是-減去)具有特殊含義。 (如果你想在一個字符類-,它必須是「第一」或最後一個,其中「第一」的意思是「可選^且僅當]後不存在」。)

在你的例子:

  • [^][()] - 這是一個否定的字符類,承認除[](),但
  • [^[]()]任何字符 - 這是承認除任何字符否定字符類210,然後是任何()在您正在使用的正則表達式系列中的符號,以及代表自身的]