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


26

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

# custom content section
a
b

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

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

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

回答:


36
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
        }; /$tail/p; d }"  existing_file

優れた。sedただ以上のことができるs/.../...
DevSolar

Hmmmは私には機能しません。sedコマンドを1行に入力する必要がありますか?
lzap 14

3
r insert_fileコマンドは、その行の最後のものでなければなりません。空白もコメントもその後に許可されないことに注意しください。オプションを有効にsedしてGNU を使用してコードをテストした--posixところ、期待どおりに動作したため、どのposix準拠 でも動作するはずsedです。
Peter.O 14

1
聖なるモリー、それはクールだ!これは私のsed辞書に載っています!とても便利で美しくシンプル。ありがとうございました!
DanielSmedegaardBuus

2
インプレース編集では、sedの出力(例output=$(sed -e "..." existing_file))をキャプチャしてから、2回目のパス(例echo "$output" > existing_file)で置換を実行する必要があります。これは、読み取り元のファイルにリダイレクトしようとすると、内容が読み取られる前に切り捨てられるためです。
クリストンキンソン16

5
newContent=`cat new_file`
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\\n).*(\\n### END GENERATED CONTENT)/\$1$newContent\$2/s" existing_file

良くやった。私のものよりずっと簡単です。:)
キティ博士

4

警告:これは間違いなく最も簡単な方法ではありません。(編集: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によって読み取られる前に、書き込みのために開かれ、クリアされます。
chepner

@chepner Crap、あなたは正しい。ただし、残りは機能します。直します。
キティ博士

3
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF

ヒアドキュメントとed行エディターを使用します。ヒアドック内の最初の行は、「+」の後の行「d」、「### BEGIN gENERATED ...」、および「-」の前の行「### END GENERATED ...」を削除します。 ### ENDが生成行の後FILE2を挿入することです...」
Jetchisel

申し訳ありませんが、「### BEGIN GENERATED ..」行の後にFILE2を挿入しました
Jetchisel 14

私にとっては簡単です。結局初めてです:-)。また、私は同じ言葉を使用したかもしれませんが、他のソリューションはヒアドキュメントではなくprintfとパイプを使用します。私が間違いを犯した場合、
とにかく

ありがとう、とても読みやすい!ところで-代わりに、別のスクリプトから読み取るようにr FILE2言うことができr !commandます。
コス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.