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