2013-07-18 77 views
5

我有一個文本正文,其中包含使用<>,##或||分隔的組。 塊從未重疊,但也可以跨越多行,像這樣:替換sed中的多個分隔塊

#A fully emphasized line# 
A line with #emphasis inside#. 
#Several lines of 
text 
With emphasis# 
no emphasis 
Line #with# multiple #emphasis#. 
Line <with some > |text of| #each type#. 

我試圖與[和] 放後]最終定界符來替換每對分隔符;例如最後一行應該是:

Line [with some ]> [text of]| [each type]#. 

我已經形成了sed腳本將做的第一部分:

sed -e ':left s/[#|<]/[/; t right; n; b left :right s/[#|>]/]/; t left;n; b right' 

但是當我嘗試使用&(或(..) + \ 1)把字符回這樣的:

sed -e ':left s/[#|<]/[/; t right; n; b left :right s/[#|>]/]&/; t left;n; b right' 

我得到如下:

[A fully emphasized line][ 
A line with ][emphasis inside][. 
][Several lines of 
text 
With emphasis][ 
no emphasis 
Line ][with][ multiple ][emphasis][. 
Line [with some ]]]]]]> [text of[ [each type[. 

雖然我不確定這裏出了什麼問題,但它似乎是以某種方式與圖案塊混在一起。我可以用三個調用(每個匹配類型一個硬編碼)替換它,但這似乎過分。

回答

4

請嘗試以下命令。它讀取內存中的整個文件,做每對分隔符的全球替代:

sed -e ' 
    :a 
    $! { N; ba }; 
    s/#\([^#]*\)#/[\1]#/g; 
    s/<\([^>]*\)>/[\1]>/g; 
    s/|\([^|]*\)|/[\1]|/g 
' infile 

它產生:

[A fully emphasized line]# 
A line with [emphasis inside]#. 
[Several lines of 
text 
With emphasis]# 
no emphasis 
Line [with]# multiple [emphasis]#. 
Line [with some ]> [text of]| [each type]#. 
+1

酷。合併版本也適用於此,所以三個搜索可以用's/[#|替換<]\([^#|>] * \)\([#|>]] \)/ [\ 1] \ 2/g;' –

+0

user2596375 - 三個sed表達式更好,因爲您的模式取代了任何一對分隔符,例如,'#text>'將被'[text]>替換,即使它不是'#text#'。 – gbrener