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
sed
, en fait de créer des fichiers temporaires, puis écraser.Réponses:
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):
Idéalement, utilisez
mktemp
pour générer un fichier temporaire unique:Mais ce n'est pas vraiment plus court ou plus concis.
Mon favori personnel est l’
sponge
utilitaire de moreutils - il lit les entrées puis écrit dans le fichier:Ou, mieux encore, ne faites pas la substitution en PHP, mais un outil qui supporte l'édition sur place, comme Perl avec:
Similaire avec
sed
, ici, le drapeau en place pour GNUsed
:Et pour BSD
sed
, vous avez besoin d'un argument vide explicite pour-i
:Vous devrez probablement adapter votre commande expression régulière / substitution à la syntaxe de Perl et de sed, respectivement.
la source
-i
option.mktemp
pour le fichier temporaire.