web-dev-qa-db-ja.com

2つのパターン(両端を含む)の間のすべての行をファイルコンテンツで置き換えます

タイトルにすべてが記載されていますが、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
3
storm

あなたは近いと思います-あなたの主な問題は、$(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
3
steeldriver