我正在尝试使用sed将%XXX%形式的文件中的模板字符串替换为我的shell脚本中名为XXX的变量的值.
例如,以下工作完美
sed "s/%user_home%/$user_home/gi"
Run Code Online (Sandbox Code Playgroud)
所以,如果user_home=fred
以下,
NameVirtualHost *:80
<VirtualHost *:80>
ServerName %server_name%
ErrorLog /var/log/apache2/%user_home%_webapp_error.log
CustomLog /var/log/apache2/%user_home%_webapp.log common
DocumentRoot /home/%user_home%/web_app/public
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
变,
NameVirtualHost *:80
<VirtualHost *:80>
ServerName %server_name%
ErrorLog /var/log/apache2/fred_webapp_error.log
CustomLog /var/log/apache2/fred_webapp.log common
DocumentRoot /home/fred/web_app/public
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
问题是我想在没有事先明确知道模板字符串及其变量的情况下运行sed命令.也就是说,它会查找%XXX%,然后用$ XXX的内容替换它,而不关心变量的实际名称是什么.
我知道它与后引用有关但我无法弄清楚如何使用后引用的内容作为变量名.
我试过了,
sed "s/%\([a-z_]\)%/$(\1)/gi"
Run Code Online (Sandbox Code Playgroud)
但这没有奏效,因为它似乎是在寻找一个名为$\1的变量.
使用awk
你可以做到这一点
awk '{gsub(/%user_home%/,"${user_home}")}1' file
NameVirtualHost *:80
<VirtualHost *:80>
ServerName %server_name%
ErrorLog /var/log/apache2/${user_home}_webapp_error.log
CustomLog /var/log/apache2/${user_home}_webapp.log common
DocumentRoot /home/${user_home}/web_app/public
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
这将替换%user_home%
为变量${user_home}