2017-04-15 126 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> 

否則,您可能需要添加邏輯來執行此操作。