2017-04-15 130 views
0

我试图用属性文件中的值替换html文件中的[[****]]占位符。输入文件用SED替换占位符

示例内容:在财产文件

<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

附加样品输入线和输出预计为清楚......和sed是不是对HTML文件中使用适当的工具... – Sundeep

+0

@Sundeep更新的问题,请检查 – popcoder

+0

imo,这不适用于bash脚本和sed ...我没有使用正确的html解析器的经验......对于给定的示例,'sed -f <(sed's/^ \([^ =] * \)= \(。* \)/ s | \\ [\\ [\\ [\ 1 \\] \\] | \ 2 | /'property.txt)ip.html'可以工作,但它很容易打破真实使用案例 – Sundeep

回答

2

您可以

. "$property_file" 

更换while循环不过,我不喜欢eval,而你并不需要声明这些设置。
你要像

sed '/=/ s/\([^=]*\)=\(.*\)/s#\\\[\\\[\1\\\]\\\]#\2#g/' "$property_file" 

很多反斜杠sed命令时,[[]]是一个艰难的选择。
可以使用进程替换使用以下命令:

sed -f <(
    sed '/=/ s/\([^=]*\)=\(.*\)/s#\\\[\\\[\1\\\]\\\]#\2#g/' "$property_file" 
     ) "${input_html}" 
+1

完美!感谢您的建议。 :) – popcoder

-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> 

否则,您可能需要添加逻辑来执行此操作。