确保在处理 awk 条件之前打开数据

Ensuring that opening data before awk condition is dealt with

我有 XML 其中包含:

</body></text></xml>
<?xml version="1.0" encoding="utf-8"><?xml-stylesheet type="text/xsl" href="stylesheetv1_1.xsl" ?><text><body>

我需要在每个 XML 声明处拆分文件。

我一直在尝试以下 awk 行,但它失败了,我不知道为什么。非常感谢收到任何帮助。

 awk '/<?xml v/{filename=NR".xml"}; {print >filename}' sourcefile.xml

其中 sourcefile.xml 包含要拆分的数据。

我认为转义问号可能是个问题,但这似乎不是问题所在。 xml 标签前面有 \r\n

我正在为 Windows 使用 Gitbash。

我最终需要的是一堆单独的文件,所有文件都以

结尾
</body></text></xml> 

并以

开头
 <?xml version="1.0" etc

shell 响应 'expression for `>' 重定向具有空字符串值',但恐怕我不确定那是什么意思。我也根本没有输出文件。

你得到的错误意味着你重定向到一个文件指向一个未定义的文件名。您的 filename 变量在脚本执行期间的某个时刻为空。

尝试在 awk 脚本的 BEGIN 块中设置该文件名变量,以确保在您的第一个 "<?xml v" 匹配之前出现的记录有去处:

awk 'BEGIN{filename="prexmlgarbage.xml"} /<\?xml v/{filename=NR".xml"}; {print >filename}' sourcefile.xml

我还在问号前添加了一个转义字符,这样您就可以正确匹配字符串 <?xml v

如果您不想在第一个 "<?xml v" 命中之前捕获记录,您也可以在 print 块之前放置一个条件:

awk '/<\?xml v/{filename=NR".xml"}; filename!=""{print >filename}' sourcefile.xml