Вместо того, чтобы тратить часы на создание полуразрушенного решения, используйте то, что уже есть!
Чтобы удалить все комментарии из XML do c, вы можете использовать
perl -mXML::LibXML -e'
binmode($_) for \*STDIN, \*STDOUT;
my $doc = XML::LibXML->load_xml( IO => \*STDIN );
$_->unbindNode() for $doc->findnodes("//comment()");
$doc->toFH(\*STDOUT);
' <old.xml >new.xml
или
perl -mXML::LibXML -e'
my $doc = XML::LibXML->load_xml( location => $ARGV[0] );
$_->unbindNode() for $doc->findnodes("//comment()");
$doc->toFile($ARGV[1]);
' old.xml new.xml
Да, чуть длиннее. Помимо того, что он работает и его легко поддерживать, он не сломается внезапно, когда кто-то предоставит
<message>
<title>...</title>
<body><![CDATA[This is not a comment: <!-- ... -->]]></body>
</message>
Для cmd
замените одинарные кавычки на двойные и наоборот, и удалите разрывы строк.
Похоже, вы хотите удалить только указанные c комментарии. Для этого вы можете использовать
$_->unbindNode() for grep /xmlns="abc"/, $doc->findnodes("//comment()");
. Вы можете избежать двойных кавычек в регулярных выражениях и строковых литералах с двойными кавычками, используя \x22
. Это поможет для cmd
.
$_->unbindNode() for grep /xmlns=\x22abc\x22/, $doc->findnodes("//comment()");