sedを使用して、あるファイルの最初のn行を別のファイルの最初のn行に置き換えます(n = 5と仮定)。

sedを使用して、あるファイルの最初のn行を別のファイルの最初のn行に置き換えます(n = 5と仮定)。

ラインを交換しようとしています(ファイル1)は、他のファイルと同じ行数と同じ場所を持ちます(ファイル2)。私が見つけた

sed -n 1,5p file2

から最初の5行を抽出します。ファイル2。この行をインポートして最初の5つを変更するにはどうすればよいですか?ファイル1?

答え1

GNUを使用した内部編集のためのオプションがsedあります-i。これR見出しコマンド(名前付きファイルから1行を読み取り、再実行するとその行の後のすべての行を読み取る)がここで役立ちます。 2行バージョン:

sed -i '1,5{R file2
        d}' file1

メモ:

  • R見出しの出力dエイレット次へ。 R各行を挿入ファイル2 後ろに d次から行を削除ファイル1。まず行けません。 (最初にdマスクのようにRコマンドは実行されません。)dnextawk

  • これR見出し(ファイル名を使用するすべてのコマンドと同様に)ファイル名を改行で区切る必要があります。一般的な;コマンド区切り文字は無視され、リテラル ""で終わるファイル名としてR解釈されます。スペースと同じで、テキストは「」で終わるファイル名として解釈されます。R file2;;RR file2 ;;

  • R影響を受け-iないので、ファイル2変更されません。

それに適応するために一行、改行に関連付けてスクリプトを構成する2つの-e式を渡すことができます。sedsed

sed -i -e '1,5{R file2' -e 'd}' file1

それ以外の場合は、以下を行う必要はありませんsed

{ head -n 5 file2; tail -n +6 file1; } > file3

一般的な場合は、$x1to$y1行をto行file1に置き換えます。$x2$y2file2

sed "$x2,\$!d;$y2 q" file2 | sed -i -e "$x1 r /dev/stdin" -e "$x1,$y1 d" file1

または:

{
  head -n "$((x1 - 1))"
  tail -n "+$x2" < file2 | head -n "$((y2 - x2 + 1))"
  tail -n "+$((y1 - x1 + 2))"
} < file1 > file3 

答え2

少しチート(純粋ではないsed)を使用してください。sponge:

{ sed -n 1,5p file2 ; sed -n '6,$p' file1 } | sponge file1

答え3

tmpファイルを使うのはどうですか?

sed -n ‘1,5p’ file2 > file3 ; sed ‘1,5d’ file1 >> file3 ; mv file3 file1

関連情報