我能想出的从文本文件中删除所有注释的最简单的解决方案是:
sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0'
解释:
将输入这样sed
的null
字符:
<Table>
\0<!--
to be removed bla bla bla bla bla bl............
removeee
to be removeddddd
-->\0
<row>
<column name="example" value="1" ></column>
</row>
</Table>
比将该grep -z
字符视为“行分隔符”
<Table>\n
<!--\n to be removed bla bla bla bla bla bl............\n\n removeee\n\n to be removeddddd\n -->
\n\n<row>\n <column name="example" value="1" ></column>\n </row>\n</Table>\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 文件,这应该可以工作。