Wie entkomme ich dem Dateipfad in SED?

39

Ich möchte ersetzen $fileWithPathin $file, aber das , weil nicht funktioniert (ich glaube) Pfad nicht entgangen ist. Wie kann man dem entkommen?

sed -i 's/${fileWithPath}/HAHA/g' $file
UAdapter
quelle

Antworten:

71
sed -i 's|'$fileWithPath'|HAHA|g' file

Einfache Anführungszeichen definieren ein Zeichenfolgenliteral. Wenn Sie die Variable außerhalb des Literales platzieren, kann die Shell diesen Teil erweitern.

Außerdem: Wenn Sie Pfade analysieren möchten, verwenden Sie im Befehl sed ein Trennzeichen, das nicht mit dem Verzeichnistrennzeichen "/" verwechselt wird.

an einer
quelle
1
Beachten Sie, dass bei $fileWithPathLeerzeichen das falsche Muster eingefügt wird.
Lekensteyn
Ihr Bonus-Tipp zum Ändern des Begrenzers für Dateipfade war ein Lebensretter!
Shadoninja
Ich denke, Sie haben zu viele Zitate in Ihrem Befehl. Mein Beispiel sed -i 's|auth-user-pass nordvpn.txt|auth-user-pass /etc/openvpn/nordvpn.txt|g' *.ovpnscheint zu funktionieren.
Léo Léopold Hertz 준영
14

Ein besserer Weg für wörtliche Zeichenfolgen mit Schrägstrichen:

sed -i "s|my/path|my/other/path|g" myFileOfPaths.txt
Jeff Lancaster
quelle
Dieser hat einen Oscar verdient! Einfach und elegant
Toan Nguyen
14

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 das Hash # - Die beste Wahl für die Begrenzung von Zeichen hängt oft von der Art der zu verarbeitenden Datei ab. In deinem Fall kannst du es versuchen

sed -i 's#'$fileWithPath'#HAHA#g' $file

Das Zeichen 'g' nach dem letzten # wird verwendet, um alle Vorkommen in der Datei zu ändern, wenn Sie nur das erste Vorkommen ändern und dann das 'g' entfernen müssen.

c0m3t
quelle