sed ersetzt Unix-Pfad durch Variable, die einen anderen Unix-Pfad enthält

sed ersetzt Unix-Pfad durch Variable, die einen anderen Unix-Pfad enthält

Ich muss den Unix-Pfad über sed durch eine Variable ersetzen, die einen anderen Unix-Pfad in einem Bash-Skript enthält

Beispiel:

another_unix_path=/another/unix/path
sed -i 's/ \/some\/path\/file.txt/ '$another_unix_path'/g' some_file.txt

Antwort1

Sie müssen Sonderzeichen maskieren:

another_unix_path="\/another\/unix\/path"
echo /some/path/file.txt | sed -e 's/\/some\/path\/file.txt/'$another_unix_path'/g'

Das Ergebnis lautet:

/ein anderer/Unix-Pfad

Antwort2

Das Escapen von Sonderzeichen /ist eine Option.

sedSie können auch das Standardtrennzeichen (das ist ) ändern, /indem Sie ?beispielsweise verwenden:

another_unix_path="/another/unix/path"
echo /some/path/file.txt | sed -e 's?/some/path/file.txt?'$another_unix_path'?g'

Das direkt nach dem Flag verwendete Zeichen sdefiniert, welches Trennzeichen verwendet wird:s?

Bearbeiten :

#!/bin/sh
basepath=/another/unix/path
baseurl=/base/url
sed -i 's?# set $IMAGE_ROOT /var/www/magento2;? set $IMAGE_ROOT '$basepath$baseurl';?g' somefile.txt

Antwort3

Wenn Sie /als Trennzeichen verwenden, müssen Sie jedes /in Ihrem Pfad enthaltene Zeichen escapen, z. B.sed 's/\/some\/path/'$replacement'/g'

Glücklicherweise erlaubt sed – wie Perl – die Verwendung vieler Zeichen als Trennzeichen, sodass Sie auch schreiben können sed 's#/some/path#'$replacement'#g'(das gFlag wird verwendet, um das Ersetzen mehrerer Vorkommen pro Zeile zu ermöglichen).

Außerdem lässt sed keinen direkten Ersatz zu, wenn Sie es auf einer Datei ausführen. Das bedeutet, dass Sie in eine temporäre Datei schreiben und sie verschieben müssen. Aktualisieren:eigentlich ist Gnus sedtuthaben eine In-Place-Option, die wie die von Perl funktioniert: -ioder -i.extwo .extsich die Backup-Erweiterung befindet. Aus Portabilitätsgründen ist Perl jedoch möglicherweise vorzuziehen.

Für den direkten Ersatz können Sie Perl wie folgt verwenden:

# In-place without backup:
perl -pi -e 's#/some/path#'$replacement'#g' <file>

# In-place with backup as .orig (note .orig is glued to the -i switch):
perl -pi.orig -e 's#/some/path#'$replacement'#g' <file>

Seien Sie mit dem zweiten Befehl vorsichtig, denn wenn Sie ihn zweimal eingeben, überschreiben Sie Ihr erstes Backup!

verwandte Informationen