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 广州经济台

3つのグループに分けたいです。

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]

これは、任意の文字a、、、または文字クラスの一部として認識します。nd]

否定文字クラスの場合、:は:]の後の最初の文字でなければなりません。^

[^]and]

aこれは、、、またはnを除くすべての文字を文字クラスの一部として認識します。d]

]それ以外の場合、マークの後の最初[は文字クラスの終わりを示します。文字クラス内では、通常の正規表現の特殊文字のほとんどが特別な意味を失い、他の(特に-マイナス)は特別な意味を取得します。(-文字クラスにを含める場合は、「最初」または「最後」にする必要があります。「最初」は、オプションの後に「存在^しない場合のみ」を意味します]。)

あなたの例では:

  • [^][()][—これは、、、、またはを除くすべての文字を認識する否定文字クラスですが]()
  • [^[]()]—これは否定された文字クラスであり、を除くすべての文字を認識し、その後に使用している正規表現ファミリで象徴するものが[続き、それ自体を表します。()]
于 2013-02-17T05:07:40.853 に答える