Câu trả lời:
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
}; /$tail/p; d }" existing_file
r insert_file
lệnh phải là điều cuối cùng trên đường dây của nó. Lưu ý rằng không có khoảng trắng cũng như bình luận nào được cho phép sau nó. Mã được kiểm tra bằng GNU sed
với --posix
tùy chọn được kích hoạt và nó hoạt động như mong đợi, do đó, mã này sẽ hoạt động với bất kỳ tuân thủ posix nào sed
.
output=$(sed -e "..." existing_file)
) và sau đó thực hiện thay thế trong một lượt thứ hai (ví dụ echo "$output" > existing_file
) vì cố gắng chuyển hướng vào một tệp bạn đang đọc sẽ khiến nó bị cắt trước khi đọc nội dung.
newContent=`cat new_file`
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\\n).*(\\n### END GENERATED CONTENT)/\$1$newContent\$2/s" existing_file
Cảnh báo: Đây chắc chắn không phải là cách đơn giản nhất để làm điều đó. (EDIT: bash hoạt động; POSIX grep cũng tốt)
Nếu văn bản chính nằm trong tệp "chính" và nội dung được tạo trong tệp "gen", bạn có thể thực hiện các thao tác sau:
#!/bin/bash
BEGIN_GEN=$(cat main | grep -n '### BEGIN GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
END_GEN=$(cat main | grep -n '### END GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
cat <(head -n $(expr $BEGIN_GEN - 1) main) gen <(tail -n +$(expr $END_GEN + 1) main) >temp
mv temp main
main
để viết, xóa nó, trước khi nó được đọc bởi con mèo.
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
bạn có thể nói r !command
để đọc từ một tập lệnh khác.
sed
có thể làm rất nhiều hơn chỉ làs/.../...
!