我试图用属性文件中的值替换html文件中的[[****]]占位符。
输入文件中的示例内容:
<html>
<host>[[my_host]]</host>
<port>[[my_port]]</port>
</html>
属性文件中的示例内容:
my_host=linkcmb.com
my_port=8080
我目前的剧本:
#/bin/sh
property_file=$1
input_html=$2
output_html=$3
IFS="="
while read k v || [[ -n "$k" ]]; do
test -z "$k" && continue
declare $k=$v
done <"$property_file"
eval "$(sed 's/\[\[\([^]]\+\)\]\]/${\1}/g' $input_html) >$output_html";
错误:Html标签也会被评估,导致错误。
./some.sh: line 32: html: No such file or directory
./some.sh: line 33: host: No such file or directory
./some.sh: line 35: /host: No such file or directory
....
....
任何建议将不胜感激。谢谢。
答案 0 :(得分:2)
您可以使用
替换while循环. "$property_file"
但是,我不喜欢eval
,您不需要声明这些设置
你想要sed
命令,如
sed '/=/ s/\([^=]*\)=\(.*\)/s#\\\[\\\[\1\\\]\\\]#\2#g/' "$property_file"
许多反斜杠,[[]]
是一个艰难的选择
您可以使用进程替换来使用这些命令:
sed -f <(
sed '/=/ s/\([^=]*\)=\(.*\)/s#\\\[\\\[\1\\\]\\\]#\2#g/' "$property_file"
) "${input_html}"
答案 1 :(得分:-1)
sed中缺少一个正则表达式选项,但它存在于perl中。如果你可以使用perl,\ Q和\ E之间的任何内容都会被转义并按字面意思删除。
脚本需要更改以创建包含所有替换命令的临时perl文件。它会是这样的:
#/bin/sh
property_file=$1
input_html=$2
output_html=$3
perlfile="$$.perl"
IFS="="
while read k v || [[ -n "$k" ]]; do
test -z "$k" && continue
echo "s/\Q[[${k}]]\E/${v}/g;" >> $perlfile
done <"$property_file"
perl -p $perlfile $input_html >$output_html
rm $perlfile
编辑: 如果您的某个属性包含斜杠(例如,路径名),则可以直接在属性文件中将其转义:
# input
<path>[[my_path]]</path>
# properties
mypath=dir\\/filename
# output
<path>dir/filename</path>
反斜杠也是如此:
# input
<path>[[my_path]]</path>
# properties
mypath=dir\\\\filename
# output
<path>dir\filename</path>
否则,您可能需要在脚本中添加逻辑才能执行此操作。