Usando o mesmo arquivo como stdin e stdout resulta em arquivo vazio

2

Se quiser filtrar um arquivo, mas se eu usar o mesmo arquivo como entrada e saída, o arquivo de saída estará vazio. Existe outra solução em vez de usar um segundo arquivo?

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

1 resposta

5

Quando você abre um arquivo para gravar com > , ele é truncado antes mesmo de você lê-lo. É por isso que está vazio.

Alternativa com um arquivo temporário (sim, isso é bastante comum):

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

O ideal é usar mktemp para gerar um arquivo temporário exclusivo:

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

Mas isso não é realmente mais curto ou mais conciso.

Meu favorito pessoal é o utilitário sponge de moreutils - lê a entrada e, em seguida, grava no arquivo:

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

Ou, melhor ainda, não faça a substituição em PHP, mas uma ferramenta que suporte edição no local, como o Perl com:

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

Semelhante a sed , aqui o sinalizador no local para o GNU sed :

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

E para o BSD sed , você precisa de um argumento vazio explícito para -i :

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

Você provavelmente terá que adaptar seu comando de expressão regular / substituição para a sintaxe do Perl e do sed, respectivamente.

    
por 16.09.2013 / 13:07