ライン範囲をライン範囲(sedまたはその他)に置き換える

ライン範囲をライン範囲(sedまたはその他)に置き換える

2つのテキストファイルがあります。両方ともfile1複数file2行があります。

$ cat file1
line one
line two
line three
line four
line five

$ cat file2
line A
line B
line C
line D
line E
line F

一つ交換したい範囲ラインfile1(ラインから1_startラインへ1_end)、ここで範囲ラインfile2(ラインから2_startラインへ2_end)。

たとえば、2,4inの行をfromの行file1に置き換えます。3,5file2

これまで私ができた唯一のfile2ことは

$ sed -n 3,5p file2

しかし、それはそれらをそこに連れて行くのに役立ちませんfile1。可能ですかsed?そうでない場合は、同様のツールを使用できますか?

ベストアンサー1

sed与えられた行範囲は次のように印刷できます。

sed -n 'X,Yp' filename

ここではX、範囲の最初の行、Y最後の行です。明示的に指示しない限り、何も印刷しないように指示し-nます。これは以下の範囲で行うことです。sedp

したがって、このコマンドを簡単に3回呼び出して一時ファイルに追加し、必要な場所にファイルを移動できます。すべて結合を使用してすべて結合し、catすべて結合することもできます。プロセスの交換この例に示されているように(私はちょうど虚空から取得した行番号を使用しています。$これはファイルの最後の行です):

cat <(sed -n '1,5p' file1) <(sed -n '10,12p' file2) <(sed -n '9,$p' file1) > file1.tmp && mv file1.tmp file1

file1ここでは、6、7、8行を10、11、12行に置き換えますfile2

修正する:@MiniMaxさんありがとうございます指摘cat次のようにすると、このような状況やプロセスの交換を回避できます。

{ sed -n '1,5p' file1; sed -n '10,12p' file2; sed -n '9,$p' file1; } > file1.tmp && mv file1.tmp file1

結局キスしてください。 :)

おすすめ記事