Die Verwendung derselben Datei wie stdin und stdout führt zu einer leeren Datei

679
Bob

Wenn Sie eine Datei filtern möchten, aber wenn ich dieselbe Datei als Eingabe und Ausgabe verwende, ist die Ausgabedatei leer. Gibt es eine andere Lösung, anstatt eine zweite Datei zu verwenden?

php -r "echo preg_replace('~/\* DEV \*/(.*)/\* ENDDEV \*/~si', '', file_get_contents('php://stdin'));" < build/index.php > build/index.php 
2
Verwenden Sie die Datei als Basis, erstellen Sie dann eine neue, löschen Sie das Original und benennen Sie die neue um. Dies kann auch als Backup-Basis nützlich sein, da Sie eine sensible Datei (einen Index) bearbeiten. Lorenzo Von Matterhorn vor 10 Jahren 0
Es ist definitiv eine Option, aber es muss einen anderen, saubereren Weg geben. Bob vor 10 Jahren 0
Ich bin mir ziemlich sicher, dass es eigentlich keinen saubereren Weg gibt, da selbst Programme mit der Option "An Ort und Stelle bearbeiten", wie "sed", * tatsächlich * temporäre Dateien erstellen und dann überschreiben. evilsoup vor 10 Jahren 2

1 Antwort auf die Frage

5
slhck

Wenn Sie eine Datei zum Schreiben öffnen >, wird sie abgeschnitten, bevor Sie sie überhaupt lesen. Deshalb ist es leer.

Alternative mit temporärer Datei (ja, das ist durchaus üblich):

php -r "…" < build/index.php > tmp mv tmp build/index.php 

Idealerweise mktempgenerieren Sie eine eindeutige temporäre Datei:

tmp="$(mktemp /tmp/file.XXX)" php -r "…" < build/index.php > "$tmp" mv "$tmp" build/index.php 

Das ist aber nicht wirklich kürzer oder prägnanter.


Mein persönlicher Favorit ist das spongeDienstprogramm von moreutils - es liest die Eingabe und schreibt dann in die Datei:

php -r "…" < build/index.php | sponge build/index.php 

Oder besser noch, ersetzen Sie nicht in PHP, sondern ein Tool, das die direkte Bearbeitung unterstützt, wie Perl mit:

perl -pi -e '…' build/index.php 

Ähnlich wie sedhier die In-Place-Flagge für GNU sed:

sed -i -e '…' build/index.php 

Und für BSD sedbenötigen Sie ein explizit leeres Argument für -i:

sed -i '' -e '…' build/index.php 

Sie müssen Ihren regulären Ausdruck / Substitutionsbefehl wahrscheinlich an die Syntax von Perl und Sed anpassen.

Oder sed, wenn es die `-i`-Option hat. Bobby vor 10 Jahren 0
Sollte wahrscheinlich "mktemp" für die temporäre Datei verwenden. Daniel Beck vor 10 Jahren 0
@ Daniel natürlich - fügte hinzu. Das OP wollte etwas "sauberes", also zögerte ich, noch mehr Code einzufügen, wenn die eigentliche Lösung beispielsweise darin besteht, das richtige Werkzeug zu verwenden. slhck vor 10 Jahren 0