用SED替换占位符

时间:2017-04-15 05:40:41

标签: linux bash shell sed scripting

我试图用属性文件中的值替换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   
....
....

任何建议将不胜感激。谢谢。

2 个答案:

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

否则,您可能需要在脚本中添加逻辑才能执行此操作。