SED im Bash-Skript: So ersetzen Sie Text durch Sonderzeichen, die aus einer Variable im Bash-Skript stammen

SED im Bash-Skript: So ersetzen Sie Text durch Sonderzeichen, die aus einer Variable im Bash-Skript stammen

Zuerst gibt es eine Variable, die Sonderzeichen im Bash-Skript enthält. Hier ist das Beispiel. list.txt:

user = root
password = 1234

Bash-Skript:

#!/bin/sh
var1 = var&2018+&
find . -name "list.txt" -exec sed -i "s/1234/"$var1"/g" {} +

als ich das Skript ausführte, war das Ergebnis: var12342018+1234.

Update 1 (Antwort von Oliv):

var1='var&2018+&'
find . -name "*list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;

und das Ergebnis immer noch: Passwort = var12342018+1234

vielleicht kann mir jemand helfen. danke

Antwort1

Zuerst müssen Sie Ihre var1Variable in Anführungszeichen setzen.

Um das Passwort als Variable anzugeben, können Sie bash -cin Ihrem Befehl Folgendes verwenden:find

 var1='var\&2018+\&'
 find . -name "list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;

Antwort2

Es könnte Ihnen helfen, Ihr Problem zu verstehen, wenn Sie wissen, dass es &sich um ein Sonderzeichen handelt, das die gesamte Übereinstimmung Ihres regulären Ausdrucks darstellt.

Da 1234gefunden wird, ersetzen Sie es durch var12342018+1234. Die beiden &werden zur übereinstimmenden Zeichenfolge.

Der andere Punkt, den ich ansprechen möchte, ist wirklich eine persönliche Vorliebe, aber die Verwendung von find ... -execwith {}, ich mag diese Syntax nicht, ich beende es normalerweise mit\;

Ich bevorzuge die Verwendung von xargs

find . -name list.txt | xargs sed -i 's/1234/var&2018+&/g'

Beachten Sie, dass die Endung „g“ es so oft ersetzt, wie es gefunden wird …

auch das dürfte offensichtlich sein.. Ich weiß nicht, wie viele list.txtDateien Sie in Ihrem Unterbaum haben, aber wenn Sie nur eine haben, brauchen Sie sie nicht find.

sed -i 's/pattern/replacement/options' filename

verwandte Informationen