如何在bash
脚本中编写简单的查找和替换,但替换来自运行PHP脚本。
例如,我需要在文件app.config
中找到:{{KEY}}
并替换为:php -f generate_key.php
的输出。sed
能做到这一点吗?
我会建议按照这些思路而不是上面基于 sed 的解决方案
:KEY="$(php -f generate_key.php)" awk '{gsub("{{KEY}}", ENVIRON["KEY"]);print;}' < app.config > app.config.new &&
mv app.config.new app.config
(在 T+20h 编辑以使用 ENVIRON
而不是 awk -v VAR=VAL
,因为后者在 VAL
中处理转义序列)
主要是因为它执行替换而不对 php 脚本的输出应用任何解释或转换。
如果 PHP 脚本的输出包含正斜杠,则基于 sed 的解决方案将失败,并且它们还将替换 PHP 脚本输出中存在的各种转义字符(n
s、t
s 等),这可能不是您想要的。
试试这个
sed -e "s/{{KEY}}/`php -f generate_key.php`/g" app.config
这会将替换字符串替换为 PHP 脚本的输出。如果要就地修改 app.config,请将选项-i
添加到命令行
sed -i -e "s/{{KEY}}/`php -f generate_key.php`/g" app.config
正如@je4d所观察到的,如果generate_key.php
的输出包含正斜杠/
,则必须改用另一个分隔符,例如
sed -e "s;{{KEY}};`php -f generate_key.php`;g" app.config
请尝试:
cat app.config|sed 's/{{KEY}}/something/g'