web-dev-qa-db-ja.com

マーカー間のテキストファイルの一部を別のテキストファイルに置き換える方法は?

次のようなテキストファイルがあるとします。

# custom content section
a
b

### BEGIN GENERATED CONTENT
c
d
### END GENERATED CONTENT

GENERATED CONTENTタグの間の部分を別のファイルの内容に置き換えたいのですが。

これを行う最も簡単な方法は何ですか?

26
smokris
newContent=`cat new_file`
Perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\\n).*(\\n### END GENERATED CONTENT)/\$1$newContent\$2/s" existing_file
5
smokris
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
        }; /$tail/p; d }"  existing_file
36
Peter.O

警告:これは間違いなく最も簡単な方法ではありません。 (編集: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
4
Dr Kitty
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
3
Jetchisel