Wenn Sie eine Datei filtern möchten, aber dieselbe Datei als Eingabe- und Ausgabedatei verwenden, ist die Ausgabedatei leer. Gibt es eine andere Lösung anstelle einer zweiten Datei?
php -r "echo preg_replace('~/\* DEV \*/(.*)/\* ENDDEV \*/~si', '', file_get_contents('php://stdin'));" < build/index.php > build/index.php
sed
, eigentlich temporäre Dateien erstellen und dann überschreiben.Antworten:
Wenn Sie eine Datei zum Schreiben öffnen
>
, wird sie abgeschnitten, bevor Sie sie überhaupt lesen. Deshalb ist es leer.Alternative mit einer temporären Datei (ja, das ist durchaus üblich):
Verwenden Sie
mktemp
im Idealfall, um eine eindeutige temporäre Datei zu erstellen:Aber das ist nicht wirklich kürzer oder prägnanter.
Mein persönlicher Favorit ist das
sponge
Dienstprogramm von moreutils - es liest Eingaben und schreibt sie dann in die Datei:Oder, noch besser, ersetzen Sie nicht PHP, sondern ein Tool, das die direkte Bearbeitung unterstützt, wie Perl mit:
Ähnlich wie
sed
hier das In-Place-Flag für GNUsed
:Und für BSD
sed
benötigen Sie ein explizites leeres Argument für-i
:Wahrscheinlich müssen Sie Ihren regulären Ausdruck / Ersetzungsbefehl an die Syntax von Perl bzw. sed anpassen.
quelle
-i
Option hat.mktemp
für die temporäre Datei verwenden.