Linux-bash脚本从文件中删除同一行之前的每一行

时间:2019-06-04 09:51:19

标签: xml linux xslt-1.0

我有一个无效的xml文件(它是另一个进程的输出),我需要在Linux(bash脚本)中对其进行验证。 在无效文件中,有空标签-没有关闭标签,如:

<om>
<om>
<some data>
</some data>
</om>

我尝试运行以下命令:

  1. 使用xsl:
xsltproc prepare_v270.xsl test.xml  > /tmp/test.xml.bak
test.xml:413282: parser error : Excessive depth in document: 256 use XML_PARSE_HUGE option
    <om>
    ^

无法解析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>
    ^

依此类推

我试图编写一个bash脚本,以通过以下脚本删除与<om>单词对应的每一行<om>

#!/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

但这不起作用。

1 个答案:

答案 0 :(得分:0)

我找到了解决方法-如果下一行相同,则删除文件中的一行。 此逻辑会在同一打开标签之前删除该打开标签。

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

谢谢大家!