【问题标题】:Find/Replace in xml file, with name/value pairs使用名称/值对在 xml 文件中查找/替换
【发布时间】:2014-04-02 19:04:05
【问题描述】:

我正在尝试编写一个 shell 脚本,该脚本将一组名称/值对和一个 XML 文件作为输入。

目的是在 XML 文件中从名称/值对文件(用标签划分)中搜索“name”字符串,并替换在 XML 文件的同一级别定义的“value”字符串(用标签)。

例如

名称/值对文件

trousers=blue
hat=red
shoes=brown

输入 XML 文件

<application>
    <Pairs>
        <Pair>
            <name>trousers</name>
            <value>black</value>
        </Pair>
        <IrritatingExtraLayer>
            <Pair>
                <name>hat</name>
                <value>green</value>
            </Pair>
        </IrritatingExtraLayer>
        <Pair>
            <name>shirt</name>
            <value>orange</value>
        </Pair>
    </Pairs>
</application>

预期的输出文件

<application>
    <Pairs>
        <Pair>
            <name>trousers</name>
            <value>blue</value>
        </Pair>
        <IrritatingExtraLayer>
            <Pair>
                <name>hat</name>
                <value>red</value>
            </Pair>
        </IrritatingExtraLayer>
        <Pair>
            <name>shirt</name>
            <value>orange</value>
        </Pair>
    </Pairs>
</application>

我已经创建了一个可以使用 xmlstarlet 执行此操作的脚本,但是它非常慢(我正在使用的文件长达数千行)。我的脚本中的主要代码sn-p(忽略预处理和后处理)是:

for line in ${namevaluepairs}; do
                name=$(echo ${line} | cut -d'=' -f1)
                value=$(echo ${line} | cut -d'=' -f2)

                outputxml=$(echo ${outputxml} | xmlstarlet ed -u "//Pair/[name='${name}']/value" -v "${value}" )
done

我能做些什么来改善这一点?

【问题讨论】:

    标签: xml bash replace xmlstarlet name-value


    【解决方案1】:

    我通常使用xsh 来完成类似的任务。与 xmlstarlet 相比,我会感兴趣以下内容的速度。

    perl { 
        open $FH, '<', 'namevalues' or die $!;
        while (<$FH>) {
            chomp;
            ($n, $v) = split /=/;
            $h->{$n} = $v;
        }
    } ;
    open 1.xml ;
    for //name {
        $v = xsh:lookup('h', text()) ;
        if $v set ../value $v ;
    }
    save :b ;
    

    诀窍是将名称-值对存储在哈希(映射、字典)中,然后处理所有名称并从哈希中检索相应的值。

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 2010-12-20
      • 1970-01-01
      • 2014-08-17
      • 2017-08-07
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多