如何替换xml文件中的变量名?

时间:2011-04-26 13:52:05

标签: bash shell unix ant

java构建工具ant提供过滤器以按值替换变量

实施例: 具有属性的文件:

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

具有通用设置的XML文件(注意@ variables @)

<driver-class>@db.driver@</driver-class>
<user-name>@db.user.name@</user-name>

使用过滤器后应对

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

如何使用bash和普通的unix工具实现这一功能?

3 个答案:

答案 0 :(得分:1)

sed -e 's/@db.driver@/com.informix.jdbc.IfxDriver/g' -e 's/@db.user.name@/user/g' > outfile.xml

答案 1 :(得分: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)

答案 2 :(得分: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/@$key@/$value/g' | " >> $tmp
done
replacement_cmd=`cat $tmp`
eval "cat \"$xml\" | $replacement_cmd cat"

rm -f $tmp