私は次のSEDコマンドを使用してあるファイルを別のファイルの最初の行に挿入しようとしましたが、大きな成功を収めませんでした。毎回行 1 の後にファイルを挿入します。 1号線の前に挿入するスイッチはありますか?
sed -i '1r file1.txt' file2.txt
よろしくお願いします。
答え1
N
コマンド経由
file2.txt
複数の行がある場合(そうでない場合は他のセクションを参照):
sed -i -e '1 { r file1.txt' -e 'N; }' file2.txt
秘密は、N
コマンドを使用して最初の行の印刷を延期することです。
マニュアルから:
窒素
パターン空間に次の入力行を追加します。
e
コマンド経由
前提file2.txt
は空ではないということです(そうでない場合は、単にコピーを作成してください)。
sed -i -e '1 e cat file1.txt' file2.txt
GNUは、引数で指定されたコマンドを実行するコマンドをsed
提供します。e
結果は直ちに出力されます。
マニュアルから:
e [コマンド]
このコマンドを使用すると、シェルコマンドの入力をパターンスペースにパイプできます。引数がない場合、 'e'コマンドはパターンスペース内のコマンドを実行し、パターンスペースを出力に置き換えます。
代わりに引数を指定すると、「e」コマンドはそれをコマンドとして解釈し、その出力を出力ストリームに送信します。
「r」コマンドとは異なり、このコマンドの出力はすぐに印刷されますが、「r」コマンドは現在の期間が終了するまで出力を遅らせます。
答え2
このsed
コマンドは、r
入力の次の行を読み取る前に、指定されたファイルの内容を出力に入れます。残念ながら、このコマンドにアドレスを指定することはできないため、0
入力の最初の行の前にファイルの内容を挿入することはできません(予約済みスペースを使用せず)。
ただし、最終的には通常のoldを使用できますcat
。これファイルをリンクするコマンド:
$ cat file1.txt file2.txt >out && mv out file2.txt
書き込んだ一時ファイルがすでに存在しないことを確認するには、次のmktemp
ユーティリティを使用できます。
$ tmp="$(mktemp)" && cat file1.txt file2.txt >"$tmp" && mv "$tmp" file2.txt
これはコマンドラインではやや厄介ですが、一時ファイルに書き込む必要があるスクリプトでは良い予防策です。
答え3
明示的な一時ファイルにアクセスしないことを決定した場合cat
(またはそのようなバッファを介して)、少なくともコマンドでゼロアドレスを許可するsponge
ようです。ed
r
ed -s file2.txt << EOF
0r file1.txt
wq
EOF
または等しく
printf '0r file1.txt\nwq\n' | ed -s file2.txt
答え4
同じディレクトリ内の複数のファイルの上に同じファイルを挿入する場合は、次のものに基づいてください。コサロナンダの答え使用することができます:
for i in file*; do tmp="$(mktemp)" && cat file1 $i >"$tmp" && mv "$tmp" $i; done