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.
sed
Sie 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 s
definiert, 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 g
Flag 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: -i
oder -i.ext
wo .ext
sich 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!