regex заменить текст в XML-файле в узле из командной строки

У меня есть XML-файл, и я бы хотел заменить все, что находится между открытым и закрывающим тегом в нескольких экземплярах узла g: gtin ничем.

Возможно ли это из командной строки, используя sed или что-то подобное?

<g:gtin>31806831001</g:gtin> 

Простое решение для простых случаев – см. Мой комментарий:

 echo "<g:gtin>31806831001</g:gtin>" | sed 's|<g:gtin>.*</g:gtin>|<g:gtin></g:gtin>|' 

Результат:

 <g:gtin></g:gtin> 

Это зависит от того, что start и endtag находятся в одной строке, и на этой строке находится не более одного тега.

Поскольку xml-файлы часто генерируются одинаково, снова и снова, предположение может иметь место.

Один из способов использования perl :

Содержание script.pl :

 use warnings; use strict; use XML::Twig; die qq[Usage: perl $0 <xml-file>\n] unless @ARGV == 1; my $twig = XML::Twig->new( twig_roots => { q[g:gtin] => \&handle_gtin, }, twig_print_outside_roots => 1, ); $twig->parsefile( shift ); sub handle_gtin { my ($t, $gtin) = @_; $gtin->set_text( q[] ); $gtin->print; } 

Запустите его так:

 perl script.pl file.xml