Xml Linux-bash脚本,用于从文件中删除同一行之前的每一行
我有一个无效的xml文件(它是另一个进程的输出),我需要在linux中验证它(bash脚本)。 无效文件中有空标记-没有关闭标记,如:Xml Linux-bash脚本,用于从文件中删除同一行之前的每一行,xml,linux,xslt-1.0,Xml,Linux,Xslt 1.0,我有一个无效的xml文件(它是另一个进程的输出),我需要在linux中验证它(bash脚本)。 无效文件中有空标记-没有关闭标记,如: <om> <om> <some data> </some data> </om> 我尝试运行以下命令: 使用xsl: xsltproc prepare\u v270.xsl test.xml>/tmp/test.xml.bak test.xml:413282:解析器错误:文档深度过深:256使用x
<om>
<om>
<some data>
</some data>
</om>
我尝试运行以下命令:
xsltproc prepare\u v270.xsl test.xml>/tmp/test.xml.bak
test.xml:413282:解析器错误:文档深度过深:256使用xml\u PARSE\u选项
^
无法分析test.xml
2.使用xmlstarlet
sudo xmlstarlet ed -d '//*[not(normalize-space())]' test.xml
test.xml:413282.5: Excessive depth in document: 256 use XML_PARSE_HUGE option
<om>
^
sudo xmlstarlet ed-d'/*[not(normalize-space())]'test.xml
xml:413282.5:文档深度过深:256使用xml\u PARSE\u选项
^
等等
我试图编写一个bash脚本,通过以下脚本删除带有
单词的行之前的每一行
:
#!/bin/sh
sed '
/\<om\>/ {
#append the next line
N
# look for "<om>" followed by "<om>"
/\<om\>.*\<om\>/ {
# print
P
# then delete the first line
D
}
}' <old.xml >new.xml
#/垃圾箱/垃圾箱
塞德
/\/ {
#追加下一行
N
#查找“”后跟“”
/\.*\/ {
#印刷品
P
#然后删除第一行
D
}
}'new.xml
但它不起作用。我找到了解决方案——如果下一行相同,则删除文件中的一行。 此逻辑在同一打开标记之前删除打开标记
pre=
while IFS='' read -r line || [[ -n "$line" ]]; do
# echo "Line read from file: $line"
# if line does not contain line pre
if ! { [ -n "$pre" ] && [[ "$line" == "$pre" ]] ; }; then
# echo " <$pre> not found!"
echo "$line"
pre=$line
fi
done <old.xml >new.xml
pre=
而IFS=''读-r行| |[[-n“$line”];做
#echo“从文件中读取的行:$Line”
#如果行不包含行预处理
如果!{[-n“$pre”]&&[“$line”==“$pre”]];};然后
#回声“找不到!”
回音“$line”
pre=$line
fi
完成new.xml
谢谢大家 到目前为止,还没有“无效XML”这样的东西。字符串要么是有效的XML文档,要么根本不是XML。任何能够正确处理XML的操作都将失败,因为输入不是XML。或者换一种说法:您给出的示例显示工具说这不是XML,并且成功地显示了输入无效。的可能重复。我不清楚
XML\u PARSE\u hug
与无效XML问题的另一部分有什么关系。也许你应该编辑你的问题。谢谢你的评论。如果没有无效的xml,我可能需要在bash脚本中编写一个循环,或者在错误是系统性的,即每个
都需要在整个文档中后跟另一个
时,使用sed的%%&&%%invalid.xml>new.xml等简单的词汇替换可能会起作用。如果没有更多关于输入是如何被破坏的信息,就没有办法给出具体的建议。这样你就不会丢失信息
pre=
while IFS='' read -r line || [[ -n "$line" ]]; do
# echo "Line read from file: $line"
# if line does not contain line pre
if ! { [ -n "$pre" ] && [[ "$line" == "$pre" ]] ; }; then
# echo " <$pre> not found!"
echo "$line"
pre=$line
fi
done <old.xml >new.xml