Wie verwende ich sed, um Zeichenfolgen zu ersetzen, die "\" enthalten?

Wie verwende ich sed, um Zeichenfolgen zu ersetzen, die "\" enthalten?

Ich habe eine Datei namensMeineDatei.txtmit folgendem Inhalt:

Benutzername=meinBenutzername
VerschlüsseltesPasswort=9k3S+sS3g\=\=

Jedes Mal, wenn ich den Benutzernamen und das Passwort ändern muss, führe ich ein Shell-Skript aus. Im Shell-Skript speichere ich den Benutzernamen und das Passwort in zwei Variablen, nämlich:

alterBenutzername="meinBenutzername"
altesPasswort="9k3S+sS3g\=\="

neuerBenutzername="meinneuerBenutzername"

neues Passwort="U8djlk+h\=="

sed -i "s/$alterBenutzername/$neuerBenutzername/g" MeineDatei.txt

sed -i "s/$altesPasswort/$neuesPasswort/g" MeineDatei.txt

Der erste sed funktioniert einwandfrei und ersetzt den Benutzernamen, der zweite sed-Befehl funktioniert jedoch nicht und das Passwort wird in der Datei nicht geändert. Ich denke, es liegt an dem in den Variablen vorhandenen Zeichen "\".

Kann mir jemand dabei helfen und mir sagen, wie ich vorgehen soll?

Danke..

Antwort1

Blöde Problemumgehung, maskieren Sie alle Backslashes:

oldpassword="$(printf "$oldpassword" | sed 's/\\/\\\\/g')"
sed -i "s/$oldpassword/$newpassword/g" MyFile.txt

Antwort2

$ cat MyFile.txt 
Username=myusername
EncryptedPassword=9k3S+sS3g\=\=
$ oldusername="myusername"
$ oldpassword="9k3S+sS3g\=\="
$ newusername="mynewusername"
$ newpassword="U8djlk+h\=="

$ perl -pe "s/\Q$oldusername/q($newusername)/e ; s/\Q$oldpassword/q($newpassword)/e" MyFile.txt
Username=mynewusername
EncryptedPassword=U8djlk+h\==

Ausperldocfür \Qundq()

Gibt den Wert von EXPR mit allen ASCII-Zeichen zurück, die nicht zu „Worten“ gehören, und mit Backslash. (Das heißt, allen ASCII-Zeichen, die nicht mit /[A-Za-z_0-9]/ übereinstimmen, wird in der zurückgegebenen Zeichenfolge ein Backslash vorangestellt, unabhängig von den Gebietsschemaeinstellungen.) Dies ist die interne Funktion, die das Escape-Zeichen \Q in Zeichenfolgen in doppelten Anführungszeichen implementiert.

Wenn das Ergebnis in Ordnung ist, verwenden Sie es perl -i -pefür die Bearbeitung direkt vor Ort,sed

Antwort3

Haben Sie den Inhalt von $oldpassword wiederholt? Die Backslashes fehlen in $oldpassword,

$ oldpassword=9k3S+sS3g\=\=
$ echo $oldpassword
9k3S+sS3g==

Daher wird das Spiel fehlschlagen.

Wenn Sie die Backslash-Zeichen dort haben möchten, setzen Sie einfache Anführungszeichen um den Wert, den Sie oldpassword zuweisen, um zu verhindern, dass die Shell sie als Escape-Sequenzen interpretiert, d. h. machen Sie den Wert zu einer wörtlichen Zeichenfolge.

$ oldpassword='9k3S+sS3g\=\=

verwandte Informationen