2012-09-27 41 views
5

Tôi muốn thay thế tất cả {} trên một dòng nhất định bằng [], nhưng rất tiếc tôi chỉ có thể khớp với lần xuất hiện cuối cùng của regexp.sed chỉ thay thế lần xuất hiện cuối cùng của trận đấu - cần phải khớp với tất cả

Tôi có một tập tin cấu hình trong đó có cấu trúc như sau:

entry { 
    id  123456789 
    desc This is a description of {foo} and was added by {bar} 
    trigger 987654321 
} 

Tôi có sed sau, trong đó có khả năng thay thế 'bar' trận đấu cuối cùng nhưng không phải là 'foo':

sed s'/\(desc.*\){\(.*\)}/\1\[\2\]/g' < filename 

Tôi neo tìm kiếm này vào dòng có chứa 'desc' như tôi ghét nó để thay thế dấu ngoặc nhọn của từng khối 'mục'.

Đối với cuộc sống của tôi, tôi không thể tìm ra cách thay thế tất cả các lần xuất hiện.

Bất kỳ trợ giúp nào được đánh giá cao - đã học cả ngày và không thể đọc thêm bất kỳ hướng dẫn nào vì sợ rằng giác mạc của tôi có thể bị nứt.

Cảm ơn!

Trả lời

4

Hãy thử như sau:

sed '/desc/ s/{\([^}]*\)}/[\1]/g' filename 

Việc tìm kiếm và thay thế trong lệnh trên sẽ chỉ được thực hiện cho dòng phù hợp với regex /desc/, tuy nhiên tôi không nghĩ rằng đây là thực sự cần thiết vì quá trình sed văn bản một dòng tại một thời điểm, vì vậy ngay cả khi không có điều này bạn sẽ không được thay thế niềng răng trên khối 'mục'. Điều này có nghĩa rằng bạn có thể có thể đơn giản hóa này như sau:

sed 's/{\([^}]*\)}/[\1]/g' filename 

Thay vì .* bên trong nhóm chụp [^}]* được sử dụng mà sẽ phù hợp với tất cả mọi thứ trừ niềng răng đóng cửa, như vậy bạn sẽ không phù hợp với từ đầu tiên mở đến lần đóng cuối cùng.

Ngoài ra, bạn chỉ có thể cung cấp tên tệp làm đối số cuối cùng cho sed thay vì sử dụng chuyển hướng đầu vào.

+0

Cảm ơn bạn F.J, điều đó đã hiệu quả! (PS - có thể đánh dấu là đã trả lời trong 3 phút rõ ràng :-) – halfpasthope

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