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

Попробуйте младшее ядро, возможно, что-то от "sid" (иначе Нестабильный).

2
20.04.2012, 17:50
2 ответа

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

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

Результат:

<g:gtin></g:gtin>

Это зависит при условии, что запускаются, и endtag находятся на той же строке, и не больше чем один тег находится на той строке.

Так как XML-файлы часто сгенерированы тот же путь, много раз, предположение могло бы содержать.

3
27.01.2020, 22:07
  • 1
    Разве я не должен передавать имя файла в sed хотя? Скажите, что я нахожусь в названных тестах / dir, и у меня есть файл под названием feed.xml, конечно, я должен сказать, заменяют все экземпляры <g:gtin>(.*?)</g:gtin> с <g:gtin></g:gtin> или что-то к тому эффекту? –  crmpicco 20.04.2012, 18:21
  • 2
    Да. Вы или передаете вывод по каналу команды через sed или указываете файл, чтобы продолжить работать. sed 'sedcommands' feed.xml была бы Ваша опция. Если у Вас есть несколько команд sed, можно поместить их в файл также: sed -f commands.sed feed.xml. Существует много опций. Флаг-i: sed -i 'commands' feed.xml изменил бы Ваш файл на месте. –  user unknown 20.04.2012, 18:36
  • 3
    @crmpicco: вопросительный знак позади.* является лишними средствами..* 0 или 1 или многие; создание этого дополнительного бессмысленно. –  user unknown 20.04.2012, 18:39
  • 4
    Могло иметь место, что @crmpicco пытается использовать ленивые кванторы, которые не доступны в портативном POSIX sed спецификация. sed и regex не являются корректным или большей частью устойчивого способа обработать XML так или иначе. –  jw013 20.04.2012, 19:52

Один способ использовать 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
0
27.01.2020, 22:07

Теги

Похожие вопросы