sed 最後の行の前に変数を挿入する

sed 最後の行の前に変数を挿入する

最後の行の前に変数を挿入したいと思います。

これは私のファイルです。

$ cat file.txt
one
two
three
four
five

変数を使わずに試してみると、問題なく動作します。

$ sed -i '$i name' file.txt
$ cat file.txt
one
two
three
four
name
five

変数を使用すると、機能しません。二重引用符とバックスラッシュのさまざまな組み合わせを試しました。

$ NAME=name
$ sed -i '$i "$NAME"' file.txt
$ cat file.txt
one
two
three
four
"$NAME"
five

答え1

ではbash、一重引用符は固定のリテラル文字列に使用されます。二重引用符は、変数の補間、コマンドの置換などを行う場所で使用されます。

コマンドsedはリテラル(コマンドがファイルの最後の行に適用される$ように)の両方を使用する必要があります。iそして $NAME変数を補間します。これを行うには、$バックスラッシュでリテラルを「エスケープ」する必要があります。そうすることで、シェルはsed スクリプト内の を「リテラルの後に$iリテラルが続く」ではなく「変数 $i の内容で置き換える」と解釈しません。$i

-iちなみに、正しい構文を調べている間に入力ファイルが台無しにならないように、オプションを使用せずにこのようなことをテストする方がよいでしょう。正確に希望どおりに動作していることが確実になったら、後でsedを追加します。-i

$ NAME=name
$ sed "\$i $NAME" file.list 
one
two
three
four
name
five

答え2

別の方法:

$ NAME=name
$ sed '$i '"$NAME" file.list
one
two
three
four
name
five

関連情報