タイトルにすべてが記載されていますが、2つのパターン間のすべての行をファイルコンテンツに置き換えたいと思います。
file1
line 1
line 2
foo
foobar
bar
line 6
line 7
file2
line 3
line 4
line 5
目的のファイル
line 1
line 2
line 3
line 4
line 5
line 6
line 7
多くのsedコマンドを試してみましたが、何も動作しません。以下の最も近いコマンドは、fooとbarの間の行に一致しますが、ファイルの内容ではなく「$(cat file2)」文字列に置き換えます。
sed '/foo/{:a;N;/bar/!ba;N;s/.*\n/$(cat file2)/};p' file1
あなたは近いと思います-あなたの主な問題は、$(cat file2)
が単一引用符内のリテラルとして扱われることです-組み込みのr
コマンドを使用する必要があります:
r filename
現在のサイクルの終了時、または次の入力行が読み取られたときに、読み取られ、出力ストリームに挿入されるfilenameの内容をキューに入れます。 filenameを読み取れない場合、エラーを表示せずに空のファイルとして扱われることに注意してください。
そう:
sed '
/foo/{
:a
N
/\nbar$/!ba
r file2
d
}
' file1
これをワンライナーにまとめたい場合は、sedがr
の後のすべてをファイル名の一部として処理しないようにする必要があります。
sed -e '/foo/{:a; N; /\nbar$/!ba; r file2' -e 'd;}' file1