Utiliser le même fichier que stdin et stdout donne un fichier vide


2

Si vous voulez filtrer un fichier mais que j'utilise le même fichier en entrée et en sortie, le fichier de sortie est vide. Y a-t-il une autre solution au lieu d'utiliser un deuxième fichier?

php -r "echo preg_replace('~/\* DEV \*/(.*)/\* ENDDEV \*/~si', '', file_get_contents('php://stdin'));" < build/index.php > build/index.php

utiliser le fichier comme base, puis en créer un nouveau, supprimer l'original et renommer le nouveau n'est pas une option que je suppose. cela pourrait également être utile comme base de sauvegarde, car vous éditez un fichier sensible (un index)
Lorenzo Von Matterhorn

C'est définitivement une option mais il doit y avoir une autre façon, plus propre.
Bob

2
Je suis assez sûr qu'il n'y a pas vraiment un moyen plus propre, puisque même les programmes avec une option « modifier en place », comme sed, en fait de créer des fichiers temporaires, puis écraser.
Evilsoup

Réponses:


6

Lorsque vous ouvrez un fichier en écriture >, celui-ci est tronqué avant même de le lire. C'est pourquoi c'est vide.

Alternative avec un fichier temporaire (oui, c'est assez courant):

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

Idéalement, utilisez mktemppour générer un fichier temporaire unique:

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

Mais ce n'est pas vraiment plus court ou plus concis.


Mon favori personnel est l’ spongeutilitaire de moreutils - il lit les entrées puis écrit dans le fichier:

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

Ou, mieux encore, ne faites pas la substitution en PHP, mais un outil qui supporte l'édition sur place, comme Perl avec:

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

Similaire avec sed, ici, le drapeau en place pour GNU sed:

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

Et pour BSD sed, vous avez besoin d'un argument vide explicite pour -i:

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

Vous devrez probablement adapter votre commande expression régulière / substitution à la syntaxe de Perl et de sed, respectivement.


Ou sed s'il a l' -ioption.
Bobby

Devrait probablement utiliser mktemppour le fichier temporaire.
Daniel Beck

@ Daniel Bien sûr - a ajouté cela. Le PO souhaitait toutefois quelque chose de "propre", aussi j’étais hésitant à inclure encore plus de code lorsque la solution actuelle consiste simplement à utiliser le bon outil, par exemple.
Slhck
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.