【发布时间】:2013-10-25 22:13:57
【问题描述】:
我正在尝试使用 sed 将 %XXX% 形式的文件中的模板字符串替换为我的 shell 脚本中名为 XXX 的变量的值。
例如以下工作完美
sed "s/%user_home%/$user_home/gi"
所以如果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>
成为,
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>
问题是我想在不事先明确知道模板字符串及其变量的情况下运行 sed 命令。也就是说,它会查找 %XXX%,然后将其替换为 $XXX 的内容,而不关心变量的实际名称是什么。
我知道它与反向引用有关,但我不知道如何使用反向引用的内容作为变量名。
我试过了,
sed "s/%\([a-z_]\)%/$(\1)/gi"
但这不起作用,因为它似乎是在寻找一个名为 $\1 的变量。
【问题讨论】:
-
反引号在那里不起作用。变量由 shell 在 将参数发送到
sed之前扩展。 -
Perl 会更好。将
$variable设置为%之间的字符串后,可以使用$ENV{$variable}获取环境变量。