我不会用
getline。(我什至在AWK书中读到,不建议使用它。)我认为,使用全局变量进行状态处理甚至更简单。(带有全局变量的表达式也可以在模式中使用。)
该脚本可能如下所示:
test-split-xml.awk:
/<fileItem>/ { collect = 1 ; buffer = "" ; file = "fileItem_"count".xml" ++count}collect > 0 { if (buffer != "") buffer = buffer"n" buffer = buffer $0}collect > 0 && /<name>.+</name>/ { # cut "...<name>" i = index($0, "<name>") ; file = substr($0, i + 6) # cut "</name>..." i = index(file, "</name>") ; file = substr(file, 1, i - 1) file = file".xml"}/</fileItem>/ { collect = 0; print file print "<?xml version="1.0" encoding="UTF-8"?>" >file print buffer >file}我准备了一些样本数据进行小型测试:
test-split-xml.xml:
<?xml version="1.0" encoding="UTF-8"?><top> <some> <fileItem> <id>1</id> <name>X1</name> </fileItem> </some> <fileItem> <id>2</id> <name>X2</name> </fileItem> <fileItem> <id>2</id> <!--name>X2</name--> </fileItem> <any> other input </any></top>
…并获得以下输出:
$ awk -f test-split-xml.awk test-split-xml.xmlX1.xmlX2.xmlfileItem_2.xml$ more X1.xml <?xml version="1.0" encoding="UTF-8"?> <fileItem> <id>1</id> <name>X1</name> </fileItem>$ more X2.xml<?xml version="1.0" encoding="UTF-8"?> <fileItem> <id>2</id> <name>X2</name> </fileItem>$ more fileItem_2.xml <?xml version="1.0" encoding="UTF-8"?> <fileItem> <id>2</id> <!--name>X2</name--> </fileItem>$
Tripleee的评论是合理的。因此,这种处理应限于个人使用,因为XML文件的不同(和合法)格式可能会导致此脚本处理中的错误。
您会注意到,
next整个脚本中没有任何内容。这是故意的。



