Đ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 {};
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
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
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