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

我有一个无效的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使用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