2011-04-26 157 views
1

Java構建工具螞蟻提供過濾器通過它們的值來替換變量如何替換xml文件中的變量名稱?

實施例: A和屬性文件:

db.user.name=user 
db.driver=com.informix.jdbc.IfxDriver 

與常規設置(注意@變量@)

甲XML文件
<driver-class>@[email protected]</driver-class> 
<user-name>@[email protected]</user-name> 

變爲使用濾波器

<driver-class>com.informix.jdbc.IfxDriver</driver-class> 
<user-name>user</user-name> 
應對後

如何用bash和普通的unix工具實現這個功能的共享?

回答

1

這僅僅是使用bash的其他實現。如果你可以爲你需要Python版本,我會建議。這將更容易維護。否則,你可以用這個bash腳本嘗試:

#!/bin/bash 

config="$1" 
xml="$2" 

tmp=$(mktemp) 

cat "$config" | while read line; do 

    key=`echo $line | sed -n 's/^\([^=]\+\)=\(.*\)$/\1/p'` 
    value=`echo $line | sed -n 's/^\([^=]\+\)=\(.*\)$/\2/p'` 

    echo " sed 's/@[email protected]/$value/g' | " >> $tmp 
done 
replacement_cmd=`cat $tmp` 
eval "cat \"$xml\" | $replacement_cmd cat" 

rm -f $tmp 
1
sed -e 's/@[email protected]/com.informix.jdbc.IfxDriver/g' -e 's/@[email protected]/user/g' > outfile.xml 
+0

感謝您的答覆(+1),這不僅是有關更換靜態文本中,特性文件​​應該因爲它包含退出了不少定義爲輸入文件。但似乎我可以從這個文件生成一個sed腳本。 – stacker 2011-04-26 14:14:07

+0

啊,我沒有得到那種細微差別。您也可以使用sed將屬性文件的每一行都轉換爲我提供的sed命令。我會稍後更新上面的答案以反映這一點。 – 2011-04-26 14:23:32

1

您可以用很短的腳本做它在幾乎任何語言 - 這裏是在Python的例子:

#!/usr/bin/env python 

import sys, re 

if len(sys.argv) != 3: 
    print "Usage: %s <mapping-file> <input-file>" % (sys.argv[0],) 
    sys.exit(1) 

mapping_file, input_file = sys.argv[1:] 

mapping = {} 

with open(mapping_file) as fp: 
    for line in fp: 
     m = re.search(r'^(.*?)=(.*)$',line) 
     if m: 
      mapping[m.group(1).strip()] = m.group(2).strip() 

def replace_from_mapping(m): 
    return mapping.get(m.group(1), m.group(0)) 

with open(input_file) as fp: 
    text = fp.read() 
    text = re.sub(r'@(.*?)@', replace_from_mapping, text) 
    sys.stdout.write(text) 
相關問題