使用相同的文件作为 stdin 和 stdout 会导致文件为空

使用相同的文件作为 stdin 和 stdout 会导致文件为空

如果想过滤一个文件,但如果我使用同一个文件作为输入和输出,输出文件为空。除了使用第二个文件之外,还有其他解决方案吗?

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

答案1

当您使用 打开文件进行写入时>,它甚至在您读取之前就被截断了。这就是它为空的原因。

使用临时文件的替代方案(是的,这很常见):

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

理想情况下,使用mktemp来生成唯一的临时文件:

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

但这实际上并不更短或更简洁。


我个人最喜欢的sponge更多工具– 它读取输入然后写入文件:

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

或者更好的是,不要在 PHP 中进行替换,而是使用支持就地编辑的工具,如 Perl:

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

与 类似sed,这里是 GNU 的就地标志sed

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

对于 BSD sed,您需要一个明确的空参数-i

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

您可能必须分别针对 Perl 和 sed 的语法调整正则表达式/替换命令。

相关内容