2013-07-18 9 views
5

Ho un corpo di testo che contiene gruppi delimitati da <>, ## o ||. I blocchi non si sovrappongono, ma possono attraversare più righe, in questo modo:Sostituzione di più blocchi delimitati in 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#. 

Sto tentando di sostituire ogni coppia di delimitatori con [e] e mettere il delimitatore finale dopo l']; per esempio l'ultima riga dovrebbe essere:

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

ho formato uno script sed che farà la prima parte:

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

Ma quando provo ad usare & (o (..) + \ 1) per mettere il carattere di nuovo in questo modo:

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

ottengo il seguente:

[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[. 

Non sono sicuro di cosa sia andato storto qui - sembra che stia aggredendo il blocco del modello in qualche modo. Potrei sostituirlo con tre chiamate (uno codificato per tipo di corrispondenza), ma sembra eccessivo.

risposta

4

Provare a seguire il comando. Si legge l'intero file in memoria e fare sostituzioni globali per ogni coppia di delimitatori:

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

cede:

[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

Cool. Anche la versione unita funziona con questo, quindi le tre ricerche possono essere sostituite con: 's/[# | <]\([^#|>] * \) \ ([# |>] \)/[\ 1] \ 2/g; ' –

+0

user2596375 - Le tre espressioni sed sono superiori perché il modello sostituisce qualsiasi coppia di delimitatori, non necessariamente corrispondenti. '#text>', ad esempio, sarà sostituito con '[testo]>' anche se non è '# text #'. – gbrener