2013-07-18 15 views
5

Mam treść tekstu, która zawiera grupy oddzielone <>, ## lub ||. Bloki nigdy nie pokrywają się, ale może przejechać wiele wierszy, tak:Zastępowanie wielu rozgraniczonych bloków w 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#. 

Ja próbując zastąpić każdą parę ograniczników z [i] i umieścić ogranicznik końcowy po sobie]; Na przykład ostatni wiersz powinny być:

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

ja utworzyli sed skrypt, który wykona część pierwsza:

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

Ale gdy próbuję użyć & (lub (..) + \ 1) umieścić znak z powrotem w ten sposób:

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

uzyskać następujące:

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

Nie jestem jednak pewien, co się tutaj stało - wygląda na to, że w jakiś sposób wkręca się w blok wzoru. Mogłem zastąpić go trzema połączeniami (zakodowanymi na jeden typ dopasowania), ale wydaje się to przesadne.

Odpowiedz

4

Spróbuj wykonać następujące polecenie. Odczytuje cały plik w pamięci i zrobić globalne substytucji dla każdej pary ograniczników:

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

to plony:

[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. Połączona wersja również działa z tym, więc trzy wyszukiwania mogą być zastąpione przez: 's/[# | <]\([^#|>] * \) \ ([# |>] \)/[\ 1] \ 2/g; ' –

+0

user2596375 - Trzy wyrażenia sed są lepsze, ponieważ twój wzorzec zastępuje dowolną parę ograniczników, niekoniecznie pasujących do nich. Na przykład '#text>' zostanie zastąpiony przez '[text]>, nawet jeśli nie jest to # # text #. – gbrener