sed fügt Variable vor der letzten Zeile ein

sed fügt Variable vor der letzten Zeile ein

Ich möchte vor der letzten Zeile eine Variable einfügen.

Dies ist meine Datei.

$ cat file.txt
one
two
three
four
five

Wenn ich es ohne Variablen versuche, funktioniert es einwandfrei.

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

Wenn ich eine Variable verwende, funktioniert es nicht. Ich habe verschiedene Kombinationen aus Anführungszeichen und Backslashs ausprobiert.

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

Antwort1

In bashstehen einfache Anführungszeichen für feste, wörtliche Zeichenfolgen. Doppelte Anführungszeichen werden dort verwendet, wo Variableninterpolation, Befehlsersetzung usw. erfolgen sollen.

Ihr sedBefehl muss sowohl einen Literalwert enthalten $(damit der iBefehl auf die letzte Zeile der Datei angewendet wird)UND $NAMEfür die zu interpolierende Variable. Dazu müssen Sie das Literal $mit einem Backslash „escapen“, damit die Shell es $iin Ihrem Sed-Skript nicht als „ersetzen durch den Inhalt der Variable $i“ interpretiert, sondern als „Literal $gefolgt von Literal i“:

Übrigens ist es besser, solche Dinge ohne die -iOption zu testen, damit sedIhre Eingabedatei nicht durcheinander gerät, während Sie die richtige Syntax herausfinden. Fügen Sie die Option -ispäter hinzu, wenn Sie sicher sind, dass sie genau das tut, was Sie möchten.

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

Antwort2

Ein anderer Weg:

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

verwandte Informationen