ラインを交換しようとしています(ファイル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
コマンドは実行されません。)d
next
awk
これ
R
見出し(ファイル名を使用するすべてのコマンドと同様に)ファイル名を改行で区切る必要があります。一般的な;
コマンド区切り文字は無視され、リテラル ""で終わるファイル名としてR
解釈されます。スペースと同じで、テキストは「」で終わるファイル名として解釈されます。R file2;
;
R
R file2 ;
;
R
影響を受け-i
ないので、ファイル2変更されません。
それに適応するために一行、改行に関連付けてスクリプトを構成する2つの-e
式を渡すことができます。sed
sed
sed -i -e '1,5{R file2' -e 'd}' file1
それ以外の場合は、以下を行う必要はありませんsed
。
{ head -n 5 file2; tail -n +6 file1; } > file3
一般的な場合は、$x1
to$y1
行をto行file1
に置き換えます。$x2
$y2
file2
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