在具有xml的txt文件中替换日期

时间:2017-01-09 08:20:23

标签: perl unix sed text-processing

我有一个文本文件,其中有一个xml数据。现在我想用dd / mm / yyyy格式替换当前日期加上2天的日期。我试过它会在Unix中使用sed命令,但我无法做到.Below命令我试图改变日期。但是它没有改变文本。

sed -i 's/\<Date\>*\<Date\>/\<Date\>date +"%m/%d/%y"<Date\>/g' avltest.xml

<Args>
     <Date>01/10/2017</Date>
<\Args>

Date 字段中,我想在运行命令时更改日期,或者我可以从脚本中使用该命令。

2 个答案:

答案 0 :(得分:0)

这是perl版本:

perl -MPOSIX=strftime -i -pe 's{<Date>.*?</Date>}{"<Date>" . strftime("%m/%d/%Y", localtime(time + 2 * 24 * 60 * 60)) . "</Date>"}e' avltest.xml

我在<>之前移除了多余的反斜杠,在/中添加了遗失的</Date>,并修复了*部分。

答案 1 :(得分:0)

不要使用正则表达式来修改XML。 It's dirty, hacky, brittle and unnecessary

#!/usr/bin/perl
use warnings;
use strict;

use XML::Twig;
use Time::Piece;

#load your file
my $twig = XML::Twig->new->parsefile('avltest.xml');

#iterate all <Date> elements. 
foreach my $date_elt ( $twig->get_xpath('//Date') ) {
   my $date = localtime;
   #increment it by two days. 
   $date += 2 * 60 * 60 * 24; #two days. 
   #replace it. 
   $date_elt -> set_text($date -> strftime("%m/%d/%Y"));       
}

#print XML to STDOUT. 
$twig -> set_pretty_print('indented_a');
$twig -> print;

这将按照描述执行您想要的操作,而不会被“年末/月末”绊倒。

如果您愿意,可以在XML twig中使用parsefile_inplace - 这需要稍微不同的代码设置。