GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erreicht man Portabilität mit Sed -i (In-Place-Editing)?

Ich schreibe Shell-Skripte für meinen Server, bei dem es sich um ein gemeinsam genutztes Hosting handelt, auf dem FreeBSD ausgeführt wird. Ich möchte sie auch lokal auf meinem PC mit Linux testen können. Daher versuche ich, sie portabel zu schreiben, aber mit sed Ich sehe keine Möglichkeit, das zu tun.

Ein Teil meiner Website verwendet generierte statische HTML-Dateien, und diese sed-Zeile fügt nach jeder Neugenerierung den korrekten DOCTYPE ein:

sed -i '1s/^/<!DOCTYPE html> n/' ${file_name.html}

Es funktioniert mit GNU sed unter Linux, aber FreeBSD sed erwartet das erste Argument nach -i Option als Erweiterung für Sicherungskopie. So würde es aussehen:

sed -i '' '1s/^/<!DOCTYPE html> n/' ${file_name.html}

GNU sed jedoch erwartet wiederum, dass der Ausdruck unmittelbar nach -i folgt .
(Es erfordert auch Korrekturen bei der Behandlung von Zeilenumbrüchen, aber das wurde hier bereits beantwortet)

Natürlich kann ich diese Änderung in meine Serverkopie des Skripts aufnehmen, aber das würde z. B. meine Verwendung von VCS für die Versionierung durcheinander bringen. Gibt es eine Möglichkeit, dies mit sed auf vollständig portierbare Weise zu erreichen?

Akzeptierte Antwort:

GNU sed akzeptiert eine optionale Erweiterung nach -i . Die Erweiterung muss im selben Argument ohne dazwischen liegendes Leerzeichen stehen. Diese Syntax funktioniert auch auf BSD sed.

sed -i.bak -e '…' SOMEFILE

Beachten Sie, dass auf BSD -i ändert auch das Verhalten bei mehreren Eingabedateien:Sie werden unabhängig voneinander verarbeitet (also z. B. $ stimmt mit der letzten Zeile jeder Datei überein). Auch dies funktioniert nicht auf BusyBox.

Wenn Sie keine Sicherungsdateien verwenden möchten, können Sie prüfen, welche Version von sed verfügbar ist.

case $(sed --help 2>&1) in
  *GNU*) set sed -i;;
  *) set sed -i '';;
esac
"[email protected]" -e '…' "$file"

Oder definieren Sie alternativ eine Funktion, um die Positionsparameter nicht zu überfrachten.

case $(sed --help 2>&1) in
  *GNU*) sed_i () { sed -i "[email protected]"; };;
  *) sed_i () { sed -i '' "[email protected]"; };;
esac
sed_i -e '…' "$file"

Wenn Sie sich nicht darum kümmern möchten, verwenden Sie Perl.

perl -i -pe '…' "$file"

Wenn Sie ein portables Skript schreiben möchten, verwenden Sie nicht -i — es ist nicht in POSIX. Machen Sie manuell, was sed unter der Haube macht – es ist nur eine weitere Codezeile.

sed -e '…' "$file" >"$file.new"
mv -- "$file.new" "$file"

Linux
  1. Wie ersetze ich eine Zeichenfolge in einer oder mehreren Dateien?

  2. Ergänzung mit „sed“?

  3. Alle C-Kommentare mit Sed löschen?

  4. Wie verwende ich sed, um meine Konfigurationsdateien mit flexiblen Schlüsseln und Werten zu ändern?

  5. Wie fülle ich eine Datei mit FF mit dd auf?

So integrieren Sie ONLYOFFICE 9.6 mit WordPress

So verwenden Sie den Sed-Befehl unter Linux mit Beispielen

So sichern Sie Linux-Server mit SE Linux

BENUTZUNG DES SED-EDITORS

So erstellen Sie einen E-Commerce mit Magento

Wie kann man Zeichen rekursiv durch sed ersetzen?