提问者:小点点

在bash中使用Regex删除XML注释


我想使用regex(awk,sed,grep.。。)删除bash中的XML注释 我也看过其他有关这方面的问题,但他们遗漏了一些东西。 下面是我的xml代码

<Table>
    <!--
   to be removed bla bla bla bla bla bl............

    removeee

    to be removeddddd
    -->

<row>
        <column name="example"  value="1" ></column>
    </row>
</Table>

所以我正在比较2个xml文件,但我不希望比较考虑到注释。 我这样做

diff file1.xml file2.xml | sed '/<!--/,/-->/d'

但这只删除了以

  • \n\n\n\n\n\n
  • grep-v将删除中间部分。

    最后tr-d将再次删除\0

    在这种情况下,应该在比较之前将其应用于两个文件,例如:

    diff <(sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' file1.xml | grep -zv '^<!--' | tr -d '\0') <(sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' file2.xml | grep -zv '^<!--' | tr -d '\0')
    

    或更易读的函数:

    stripcomments() {cat "$@" | sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0'}
    
    diff <(stripcomments file1.xml) <(stripcomments file2.xml)
    

    从理论上讲,CDATA块可能存在一些问题,因为它们可以用于不平衡的注释,并且它们具有重要的空字符的可能性更高,但我在现实生活中从未见过这样的xml文件。

    因此,对于大多数有效的XML文件,这应该是可行的。