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

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.


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.