Linux 如何基于标记将单个XML文件拆分为多个

Linux 如何基于标记将单个XML文件拆分为多个,linux,shell,unix,awk,Linux,Shell,Unix,Awk,我有一个带有标记的XML文件。我想像这样分割文件 <?xml version="1.0" encoding="UTF-8"?> <EMPRMART CREATION_DATE="08/20/2018 18:06:44" REPOSITORY_VERSION="187.96"> <REPOSITORY NAME="REP_DEV" VERSION="187" CODEPAGE="UTF-8" DATABASETYPE="Sybase"> <FOLDER N

我有一个带有标记的XML文件。我想像这样分割文件

<?xml version="1.0" encoding="UTF-8"?>
<EMPRMART CREATION_DATE="08/20/2018 18:06:44" REPOSITORY_VERSION="187.96">
<REPOSITORY NAME="REP_DEV" VERSION="187" CODEPAGE="UTF-8" DATABASETYPE="Sybase">
<FOLDER NAME="MC_DEV" 
    <CONFIG DESCRIPTION ="Default ORDER configuration object" ISDEFAULT ="YES" NAME ="default_ORDER_config" VERSIONNUMBER ="1">
        <ATTRIBUTE NAME ="Advanced" VALUE =""/>
        <ATTRIBUTE NAME ="Order type" VALUE ="NO"/>
    </CONFIG>
    <ORDER DESCRIPTION ="" ISVALID ="YES" 
        <ATTRIBUTE NAME ="Normal" VALUE =""/>
        <ATTRIBUTE NAME ="Order type" VALUE ="NO"/>
    </ORDER>
    <ORDER DESCRIPTION ="" ISVALID ="YES" 
        <ATTRIBUTE NAME ="Medium" VALUE =""/>
        <ATTRIBUTE NAME ="Order type" VALUE ="NO"/>
    </ORDER>
    <ORDER DESCRIPTION ="" ISVALID ="YES" 
        <ATTRIBUTE NAME ="Advanced" VALUE =""/>
        <ATTRIBUTE NAME ="Order type" VALUE ="NO"/>
    </ORDER>
    <LOCATION DESCRIPTION ="" ISENABLED ="YES" 
    </LOCATION>
</FOLDER>
</REPOSITORY>
</EMPRMART>


为了实现您的要求,我不会使用awk,而是使用一个好的XML解析器,比如xmlstarlet或xmlint。这里有一个未知值,即名称为
顺序的节点总数。我们可以为选择编写一个高级XPath,但我们会保持简单:

xmlstarlet sel -t -v 'count(//ORDER)' file.xml
现在您有了计数,可以循环所有案例并将它们写入文件:

#!/usr/bin/env bash
xmlfile=file.xml

n=$(xmlstarlet sel -t -v 'count(//ORDER)' file.xml)
for i in $(seq 1 $n); do
   xmlstarlet sel -t -m "//ORDER[${i}]" -c . $xmlfile > "File${i}.xml"
done

如果您确实使用了
gnu awk
,这将给出您所要求的结果

awk '/<ORDER>/ {f=1;++a} f {print > "file_"a".xml"} /<\/ORDER>/ {f=0}' file
awk'/{f=1;++a}f{print>“文件a.xml”}/{f=0}文件

它将只打印从
的行,作为名为
file_1.xml
file_2.xml
等文件中的一个部分。在每个UNIX框上的任何shell中都有任何awk

awk '/<ORDER/{f=1; out="file_"(++c)".xml"} f{print > out} /<\/ORDER>/{close(out); f=0}' file
awk'/out}/{close(out);f=0}文件

它显然是脆弱的,因为它只是对文本进行regexp匹配,而不是解析XML,但它适用于您发布的示例和任何类似的文本。

您的XML无效。节点名为
顺序为
的节点未关闭。对于
文件夹
位置
也一样,您缺少
xmlstarlet。此实用程序未安装。如果您下载cygwin for windows,则可以选择包含xmlstarlet包。这就是我所做的。只需确保选择“视图”下拉列表的“完整”选项。。。
awk '/<ORDER>/ {f=1;++a} f {print > "file_"a".xml"} /<\/ORDER>/ {f=0}' file
awk '/<ORDER/{f=1; out="file_"(++c)".xml"} f{print > out} /<\/ORDER>/{close(out); f=0}' file