如果想过滤一个文件,但如果我使用同一个文件作为输入和输出,输出文件为空。除了使用第二个文件之外,还有其他解决方案吗?
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 的语法调整正则表达式/替换命令。