2013-07-18 30 views
5

Tôi có nội dung chứa các nhóm được phân tách bằng <>, ## hoặc ||. Các khối không bao giờ trùng nhau, nhưng có thể vượt qua nhiều dòng, như vậy:Thay thế nhiều khối giới hạn trong 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#. 

Tôi đang cố gắng để thay thế mỗi cặp delimiters với [và] đặt dấu phân cách thức sau]; ví dụ như các dòng cuối cùng nên là:

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

tôi đã hình thành một kịch bản sed mà sẽ làm phần đầu tiên:

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

Nhưng khi tôi cố gắng sử dụng & (hoặc (..) + \ 1) để đưa nhân vật trở lại trong như thế này:

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

tôi nhận được như sau:

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

Tôi không chắc chắn những gì đã đi sai ở đây mặc dù - nó dường như được vặn với khối mô hình theo một cách nào đó. Tôi có thể thay thế nó bằng ba cuộc gọi (một mã hóa cứng cho mỗi loại đối sánh), nhưng điều đó có vẻ quá mức.

Trả lời

4

Hãy thử lệnh sau. Nó đọc toàn bộ tập tin trong bộ nhớ và làm thay toàn cầu cho mỗi cặp delimiters:

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

nó mang lại:

[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

mát. Phiên bản đã hợp nhất cũng hoạt động với phiên bản này, vì vậy, ba tìm kiếm có thể được thay thế bằng: 's/[# | <]\([^#|>] * \) \ ([# |>] \)/[\ 1] \ 2/g; ' –

+0

user2596375 - Ba biểu thức sed cao hơn vì mẫu của bạn thay thế bất kỳ cặp dấu tách nào, không nhất thiết phải khớp với nhau. '#text>', ví dụ, sẽ được thay thế bằng '[text]>' mặc dù nó không phải là '# text #'. – gbrener

Các vấn đề liên quan