2011-11-17 29 views
8

tôi chỉ đơn giản muốn làm sauthay thế nhiều mô hình dòng trong sed

thay

EXTRATHING { 
}; 

bởi

SOMETHING {}; 

trong inputfile. Đối với điều này, tôi đã thử

sed -e 's/EXTRATHING {\n};/SOMETHING/' input_file.txt >outfile.txt 

Điều này không hiệu quả. Ai đó có thể đề xuất những gì sẽ là cách chính xác để làm điều này với sed?

Trả lời

5
sed -n '1h;1!H;${;g;s/EXTRATHING {\n};/SOMETHING {};/g;p;}' input_file.txt 

sẽ làm điều đó.

Vấn đề với điều này là nó lưu trữ toàn bộ chuỗi đầu vào trong bộ đệm của sed.

Xem sed and Multi-Line Search and Replace để biết thêm thông tin và phiên bản hiệu quả hơn.

0

Điều này có thể làm việc cho bạn:

sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file.txt >output_file.txt 

hoặc nếu bạn muốn chỉnh sửa các tập tin ban đầu:

sed -i '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file 

EDIT: theo yêu cầu đây là một ví dụ:

cat <<! | sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' 
> aaa 
> EXTRATHING { 
> }; 
> bbb 
> EXTRATHING { 
> }; 
> ccc 
> ! 
aaa 
SOMETHING{} 
bbb 
SOMETHING{} 
ccc 

EDIT : Nếu địa chỉ đầu tiên và cuối cùng là các dòng liên tiếp, hãy sử dụng:

# cat <<\! | sed '/^EXTRATHING {/{N;s/^EXTRATHING {\n};/SOMETHING{}/}' 
> aaa 
> EXTRATHING { 
> bbb 
> }; 
> ccc 
> EXTRATHING { 
> }; 
> ddd 
> ! 
aaa 
EXTRATHING { 
bbb 
}; 
ccc 
SOMETHING{} 
ddd 

Một cách khác (có lẽ dễ dàng hơn?):

echo -e "EXTRATHING {\n};" | sed '$!N;s/^EXTRATHING {\n};/SOMETHING {};/;P;D' 
SOMETHING {}; 
+0

cẩn thận để đăng ví dụ của bạn rằng thao tác này ;-)? Tôi chỉ nhận được tài liệu gốc trở lại .. Chúc may mắn. – shellter

+0

Cảm ơn @potong. Tuy nhiên, lệnh của bạn cũng sẽ xóa mẫu gốc nếu có một số dòng khác giữa "EXTRATHING {" và "};". Tôi không muốn những người được thay thế.Vì vậy, không nên thay thế các mục sau đây "EXTRATHING {\ n something \ n};". – bbv

+0

Cảm ơn, tôi thấy mã của bạn hoạt động với sed 4 *, nhưng không phải với phiên bản chưa được phiên bản mà tôi có trong UWIN. Bạn đang sử dụng một biểu thức phạm vi để nắm bắt hai dòng? tức là '/ x /,/y /'? Chúc mọi người may mắn. – shellter

3

sed -e '/begin/,/end/{s/begin/replacement/p;d}'

+4

Bạn có thể giải thích điều này không? Cảm ơn. :) – Ray

+1

Tôi nghĩ rằng nó được dựa trên một sự hiểu biết xấu của câu hỏi. – BCS

3
sed -i.bak '/EXTRATHING/{N;s//SOMETHING/;s/\n//}' input_file.txt 
1
perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' your_file 

thử nghiệm dưới đây:

> cat temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
EXTRATHING { 
}; 
ghekg 
jhgjk 
wefjkwngk 
EXTRATHING { 
    }; 
jbgvjnrg 
jbfw 
wefnkwk 
EXTRATHING { 
}; 
> perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
SOMETHING{}; 
ghekg 
jhgjk 
wefjkwngk 
SOMETHING{}; 
jbgvjnrg 
jbfw 
wefnkwk 
SOMETHING{}; 
> 

nếu bạn muốn thay đổi các tập tin inline . thêm một lá cờ -i. như:

perl -i -lne '.......' your_file 
0

Khó khăn để làm điều đó trong sed, cần viết bảng con. Tuy nhiên, bạn có thể sử dụng một lớp lót bằng perl:

perl -0777 -pe 's/EXTRATHING {\n/SOMETHING {/g' input_file.txt > outfile.txt 

nơi -0777 là kỷ lục separator (endline trong các tập tin văn bản) -p chạy lệnh cho tất cả các tập tin và in trên màn hình -e nói một mình dòng lệnh

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