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

2

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
Bob
quelle
Verwenden Sie die Datei als Grundlage, erstellen Sie eine neue, löschen Sie die ursprüngliche und benennen Sie die neue um. Dies ist keine Option, die ich annehme. Dies kann auch als Backup-Basis nützlich sein, da Sie eine vertrauliche Datei (einen Index) bearbeiten
Lorenzo Von Matterhorn
Es ist definitiv eine Option, aber es muss einen anderen, saubereren Weg geben.
Bob
2
Ich bin ziemlich sicher , dass es tatsächlich ist kein sauberer Weg, denn auch Programme mit einem ‚bearbeiten anstelle‘ Option, wie sed, eigentlich temporäre Dateien erstellen und dann überschreiben.
Übelsuppe

Antworten:

6

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):

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

Verwenden Sie mktempim Idealfall, um eine eindeutige temporäre Datei zu erstellen:

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

Aber das ist nicht wirklich kürzer oder prägnanter.


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

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

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

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

Ähnlich wie sedhier das In-Place-Flag für GNU sed:

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

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

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

Wahrscheinlich müssen Sie Ihren regulären Ausdruck / Ersetzungsbefehl an die Syntax von Perl bzw. sed anpassen.

slhck
quelle
Oder sed, wenn es die -iOption hat.
Bobby
Sollte wahrscheinlich mktempfür die temporäre Datei verwenden.
Daniel Beck
@ Daniel Natürlich - das hinzugefügt. Das OP wollte jedoch etwas "Sauberes", also zögerte ich, noch mehr Code einzuschließen, wenn die eigentliche Lösung zum Beispiel nur darin besteht, das richtige Tool zu verwenden.
Slhck