Wie man einen String sed und durch einen Ordnerpfad ersetzt

14

Ich versuche das folgende Bash-Skript zu schreiben:

HOME_DIR=/opt/my_home
find ./CONFIG -type f -exec sed -i "s/_HOME_DIR_/$_HOME_DIR/g" {} \;

Die Zeile, die in den Dateien geändert werden soll, lautet wie folgt:

users                   = "_HOME_DIR_/config/data/_DOMAIN_/users.conf"

Das Endergebnis muss also sein:

users                   = "/opt/my_home/config/data/_DOMAIN_/users.conf"

Aber ich verstehe das nicht ... Ich denke, es liegt an Fluchtzeichen ...

Kann jemand Licht ins Dunkel bringen?

Vielen Dank

Felipe Caldas
quelle
Sie meinen, s (h) ed etwas Licht
Alexandre Holden Daly

Antworten:

23

In Fällen, in denen die Ersetzungszeichenfolge oder die Musterzeichenfolge Schrägstriche enthält, können Sie die Tatsache nutzen, dass GNU sed einen alternativen Begrenzer für den Ersetzungsbefehl zulässt. Häufige Auswahlmöglichkeiten für das Trennzeichen sind das Pipe-Zeichen |oder der Hash. #Die beste Auswahl für das Trennzeichen hängt häufig vom Typ der zu verarbeitenden Datei ab. In deinem Fall kannst du es versuchen

sed -i "s#_HOME_DIR_#$HOME_DIR#"

Beachten Sie auch, dass Sie den Variablennamen $ HOME_DIR falsch eingegeben haben (dieser beginnt nicht mit einem Unterstrich).

$ HOME_DIR=/opt/my_home
$ echo "_HOME_DIR_/config/data/_DOMAIN_/users.conf" | sed "s#_HOME_DIR_#$HOME_DIR#"
/opt/my_home/config/data/_DOMAIN_/users.conf

Wenn Sie möchten, sollten Sie die Verwendung von Großbuchstaben für Benutzervariablen in Ihrem Skript vermeiden. Diese sollten für Systemvariablen reserviert sein. Außerdem ist der gSchalter nur erforderlich, wenn Sie mehrere Ersetzungen in einer einzelnen Zeile vornehmen möchten.

Stahlfahrer
quelle
0

Das Hardcodieren der Variablen 'opt / home' funktioniert folgendermaßen.

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
benutzer_von_ubuntu_linux
quelle