回答:
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
コマンドは、その行の最後のものでなければなりません。空白もコメントもその後に許可されないことに注意してください。オプションを有効にsed
してGNU を使用してコードをテストした--posix
ところ、期待どおりに動作したため、どのposix準拠 でも動作するはずsed
です。
output=$(sed -e "..." existing_file)
)をキャプチャしてから、2回目のパス(例echo "$output" > existing_file
)で置換を実行する必要があります。これは、読み取り元のファイルにリダイレクトしようとすると、内容が読み取られる前に切り捨てられるためです。
警告:これは間違いなく最も簡単な方法ではありません。(編集:bashは動作します; POSIX grepも問題ありません)
メインテキストがファイル「main」にあり、生成されたコンテンツがファイル「gen」にある場合、次のことができます。
#!/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
、catによって読み取られる前に、書き込みのために開かれ、クリアされます。
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
言うことができr !command
ます。
sed
ただ以上のことができるs/.../...
!