Ich bin ein relativer Linux-Neuling. Angenommen, ich habe eine Textdatei a.txt
das den folgenden Text enthält:
A
B
C
Wenn ich nun den Text in Zeile 2 ändern möchte (die B
), kann ich den folgenden sed
verwenden Befehl:
sed -i '2s/^.*$/X/' a.txt
um das B
zu ändern bis X
, zum Beispiel.
Aber jetzt nehmen wir an, ich möchte einen sed
schreiben Befehl, der den Text in Zeile 2 in etwas ändert, das enthält eine Bash-String-Variable. Ich möchte den Text in Zeile 2 in fname="myaddress"
ändern , wobei die Anführungszeichen explizit eingeschlossen sind, und wobei myaddress
ist eine Bash-String-Variable (an anderer Stelle definiert). Um dies zu versuchen, habe ich ein Bash-Shell-Skript namens mytest.sh
erstellt und folgendes enthält:
#!/bin/bash
myaddress="/home/"
echo fname="$myaddress"
head a.txt
sed -i '2s/^.*$/fname="$myaddress"/' a.txt
head a.txt
Jetzt echo fname="$myaddress"
gibt fname="/home/"
aus , das ist der Text, den ich wünsche in Zeile 2 von a.txt
sein . Allerdings sed
gibt stattdessen fname="$myaddress"
aus zu Zeile 2 von a.txt
, wahrscheinlich weil es innerhalb der umgebenden Apostrophe steht. Mit anderen Worten, die Ausgabe des obigen Bash-Shell-Skripts lautet:
fname="/home/"
A
B
C
A
fname="$myaddress"
C
Meine Frage ist, wie bekomme ich sed
um den Wert tatsächlich zu drucken gespeichert in myaddress
und referenziert durch $myaddress
?
Akzeptierte Antwort:
Dabei gibt es zwei Probleme:Erstens müssen Shell-Variablen, wie bereits von Kevin angemerkt, in doppelte Anführungszeichen gesetzt werden, wenn sie von der Shell erweitert werden sollen. Zweitens enthält Ihre Ersetzungszeichenfolge einen /
, daher können Sie /
nicht verwenden gleichzeitig als Trennzeichen für sed
. Wenn Sie dieses Zeichen kennen, sagen Sie ,
, wird definitiv nicht in der Ersetzungszeichenfolge vorkommen, Sie könnten dieses Zeichen als sed
verwenden Trennzeichen, so erhalten Sie
sed -i '2s,^.*$,fname="'"$myaddress"'",' a.txt