Раскомментируйте XML в Perl на Windows - PullRequest
1 голос
/ 04 августа 2020

Я написал небольшой сценарий perl для Linux, чтобы удалить комментарий из файла XML.

Например, следующая команда для Linux

perl.exe -i -0777 -pe 's/\s*<!--\s*\n(.*?xmlns="abc".*?)\n\s*-->/\n$1/' test.xml

раскомментирует тег ниже в test.xml

...
<!--
<subsystem xmlns="abc"> 
-->
...

Теперь мне нужно выполнить указанную выше команду и на Windows. Поэтому я установил Strawberry Perl (Perl v5.30.2), но не могу заставить работать вышеуказанное. Что я делаю не так?

1 Ответ

3 голосов
/ 04 августа 2020

Вместо того, чтобы тратить часы на создание полуразрушенного решения, используйте то, что уже есть!

Чтобы удалить все комментарии из 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()");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...