2016-11-18 1 views
0

мне нужно заменить значение даты 2016-11-02 в меткой даты с новым значением с помощью Perl-один лайнерЗаменить тег и значение в XML с помощью Perl одного лайнера

<header> 
      <name>V5 CDS Composites</name> 
      <version>1.1a</version> 
      <date>2016-11-02</date> 

    </header> 

Я могу это сделать используя xml libxml, но хотите сделать это как можно короче, используя perl one liner. Я не могу использовать только 2016-11-02, поскольку есть несколько экземпляров этого с разными тегами.

Я делаю это внутри оболочки, где тег и значение внутри переменной

+0

Вы хотите использовать только «perl», а не какие-либо надлежащие инструменты «xml»? – Inian

+0

да, хотите использовать только perl – BRATVADDI

+0

@BRATVADDI 'awk -F '<|>' -v newDate =" 2222-11-00 "'/ /{gsub (/ 2016-11-02 /, newDate, $ 3)} 1 'inputfile', если вы в порядке с 'awk. Однако я не поощряю вас использовать инструменты xml unaware. –

ответ

1

Попробуйте следующий один лайнер

perl -pe 'my $new_date = "2016-12-12"; s/<date>.+/<date>$new_date<\/date>/g' xml.txt 

Здесь

-p use to iterate the loop on a file and the line gets print after that. 

-e for execute the script 

И есть еще один переключатель используйте для выполнения изменений в исходном файле. который составляет -i. Затем вы хотите, чтобы сделать копию исходного файла означает, что Oneliner должен быть

perl -i.copy -pe 'my $new_date = "2016-12-12"; s/<date>.+/<date>$new_date<\/date>/g' xml.txt 

Файл будет храниться в .copy расширения.

+0

искал именно это. нужны двойные кавычки, так как оболочка не разрешит переменную, иначе – BRATVADDI

1

Это один лайнер сделать работу и сохранить файл, прежде чем делать substituion

perl -pi.back -e 's~(?=<date>)[\d-]+(?=</date>)~2016-11-18~' file.xml 
+1

посмотрите вперед и загляните за крутой идеей :) – mkHun

2

Используйте perlи осознаваемому инструмент XML:

perl -MXML::Twig -0777 -e '$t=XML::Twig->parse(<>);$_->set_text('2017-01-01') for $t ->get_xpath('.//date');$t->print' 

Или, может быть:

perl -MXML::Twig -0777 -e 'XML::Twig->new(twig_handlers=>{date=>sub{$_->set_text("2017-01-01")}})->parse(<>)->print' 

(Немного короче, зависит от того, читать или нет).

Это технически немного длиннее, чем некоторые из альтернатив здесь, но имеет преимущество быть актуальным XML-анализируемое решение.

Вместо этого вы можете использовать parsefile_inplace, чтобы использовать его «sed like» в файле. Вы также можете найти установку pretty_print, чтобы быть полезной, чтобы переформатировать XML.

Смежные вопросы