通过shell脚本解析XML

时间:2014-04-02 10:30:27

标签: xml linux parsing xmlstarlet

我正在使用xmlstarlet进入shell脚本,使用此命令解析xml文件的无标题app.xml,只是为了获取其内容为字符串,并将其存储在“my_var”中:

my_var=`xmlstarlet sel -t -m "//root/services/service[position=$i]" -v description -n /home/wissem/Bureau/app.xml`

然后,当尝试使用此命令行使用最后一个命令的输出修改其他xml文件untitled strings.xml时:

find /root/AndroidStudioProjects/FacebookMenu/app/src/main/res/values/strings.xml -type f -exec  perl -pi -w -e 's/name=\"text_'$i'\".*\<\/string\>/name=\"text_'$i'\"\>'$my_var'\<\/string\>/g' {} \;

我收到以下错误:

Substitution replacement not terminated at -e line 1.

我尝试通过将我正在解析的字符串分别更改为我的变量来理解该问题,我注意到当字符串上有“空格”时问题出现了!

解释更多:for this_is_my_string:it works

这是我的字符串:我收到错误。

1 个答案:

答案 0 :(得分:1)

是的,如果$my_var包含空格,那么shell会破坏$my_var中的参数。这应该有效:

-e "s;name=\"text_$i\".*</string>;name=\"text_$i\">$my_var</string>;g"

双引号可防止您的论点被拆分。您希望成为参数一部分的双引号是已经引用反斜杠,它可以保护它们。当出现在双引号中时,$变量 被展开。我还将s/../../g替换为s;...;...;g,以便向前扫描不需要转义。而且我很确定没有理由逃避尖括号。

我已用以下程序测试了上述内容:

  1. 创建包含以下内容的/tmp/testq.xml

    <string name="text_100">Blah</string>
    
  2. 问题:

    i=100
    my_var="room service"
    
  3. 问题:

    find /tmp/ -name "testq.xml" -exec perl -p -e "s;name=\"text_$i\".*</string>;name=\"text_$i\">$my_var</string>;g" '{}' \;
    
  4. stdout的结果:

    <string name="text_100">room service</string>
    
  5. 我在上面的测试中没有使用-i,因为我希望能够多次重新运行测试,但-i不应影响{{1}的有效性表达。