![sed 最後の行の前に変数を挿入する](https://rvso.com/image/1558663/sed%20%E6%9C%80%E5%BE%8C%E3%81%AE%E8%A1%8C%E3%81%AE%E5%89%8D%E3%81%AB%E5%A4%89%E6%95%B0%E3%82%92%E6%8C%BF%E5%85%A5%E3%81%99%E3%82%8B.png)
最後の行の前に変数を挿入したいと思います。
これは私のファイルです。
$ 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