GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden einer Referenz auf eine Bash-String-Variable in Sed?

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

Linux
  1. Bash-Scripting(I)

  2. Verwenden Sie Sed, um ein Zeichen an der n-ten Position der übereinstimmenden Zeichenfolge hinzuzufügen?

  3. String-Ersetzung mit einem Wörterbuch?

  4. Wie schreibe ich eine mehrzeilige Zeichenfolge mit Bash mit Variablen?

  5. Linux-Bash, Camel-Case-String zum Trennen durch Bindestrich

Bash-Exportvariable

Bash Strings verketten

Ersetzen von Zeichenfolgen in Bash

Bash-Scripting – String-Manipulation

Bash-Anfängerserie Nr. 4:Verwenden von Arrays in Bash

Verwenden des Bash-printf-Befehls zum Drucken formatierter Ausgaben