Nコマンド経由

Nコマンド経由

私は次の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ようです。edr

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

関連情報