【问题标题】:Reading filenames from XML using xmlstarlet and merge them in bash使用 xmlstarlet 从 XML 读取文件名并将它们合并到 bash
【发布时间】:2011-08-30 19:33:22
【问题描述】:

我需要使用带有 .sh 脚本的 xmlstarlet 从 xml 配置文件中读取一些文件名,并将这些文件的内容(以相同的顺序)合并到一个文件中。

这是我的 xml 结构:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <level1>
      ...
    </level1>

    <level2>
        <david>
            <txtfile>file1.txt</txtfile>
            <txtfile>file2.txt</txtfile>
            <txtfile>somefile.txt</txtfile>

            <incfile>config.inc</incfile>
            <incfile>foo.inc</incfile>
       </david>
       <jack>
           <txtfile>filex.txt</txtfile>
           <txtfile>filey.txt</txtfile>

           <incfile>otherconfig.inc</incfile>
           <incfile>foo1.inc</incfile>
       </jack>
    </level2>
</config>

使用 xmlstarlet 读取(可能添加到 bash 中的数组)这些文件名后,我必须使用类似

的命令将文件内容合并到单个文件中
cat file1.txt,file2.txt,filex.txt > jack.txt

但我不确定。我在 .sh 脚本方面没有很好的技能,但总而言之,我需要生成一些合并文件,其中包括上述文件名的内容,如下所示:

/level2/david.txt (includes file1.txt, file2.txt, somefile.txt )
/level2/david.inc (includes config.inc, foo.inc)
/level2/jack.txt  (includes filex.txt, filey.txt)
/level2/jack.inc  (includes otherconfig.inc, foo1.inc)

我该怎么做?

【问题讨论】:

  • 我不明白你的例子。您正在混合来自 的内容并将其存储到 jack.txt 中?在 bash 中解析 XML 似乎不是一个好主意。 Perl 或 python 似乎更有可能成为嫌疑人。
  • 不,我不想混用。 David 和 Jack 节点具有不同的 .inc 和 .txt 文件。在您发表评论后,我编辑了问题。我最终希望 节点的所有 .txt 文件都转到 david.txt, 节点的所有 .inc 文件都转到 david.inc 等等。

标签: xml perl bash shell scripting


【解决方案1】:
xmlstarlet el /tmp/x.xml | sort -u | while read f; do E=""; case "$f" in */txtfile) E=".txt";; */incfile) E=".inc";; *) continue; esac; ONE=`dirname $f`; TWO=`dirname $ONE`; ONE=`basename $ONE`; TWO=`basename $TWO`; filename="/$TWO/$ONE$E"; echo "cat `xmlstarlet sel -t -c \"$f\" /tmp/x.xml |  sed -e 's|</[^>]*><[^>]*>| |g' -e 's|<[^>]*>||g'` >> $filename"; done

【讨论】:

  • 哇!奇迹般有效!它比我想象的要复杂。非常感谢。
猜你喜欢
  • 2015-06-29
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2015-02-03
  • 1970-01-01
相关资源
最近更新 更多