我有几个名为TC_Circle1 , TC_Circle2 ,TC_Point1等XML文件在目录中,我想使用脚本来更新每个文件中的开始和结束date。 开始date和结束date在每个文件内部和标签中。
我在使用Sun机器时遇到了一个脚本,但它不适用于新的HP Linux机器。 它不显示任何错误,不会更改date。 我需要帮助让它在Linux中工作。 剧本:
#!/usr/local/bin/perl $numArgs = @ARGV; if ($numArgs != 2) { print "Usage: replace_default_date.pl DEFAULT_START_DATE DEFAULT_STOP_DATEn"; } @filenames = `ls TC*`; chomp(@filenames); foreach $file (@filenames) { open(REGFILE,"$file") || die "Cannot open |$file|"; @lines = <REGFILE>; close(REGFILE); open(WRITEFILE),">$file") || die "Cannot open |$file|"; foreach $line (@lines) { if ($line =~ /DEFAULT_START_DATE/) { $newline = " " . $ARGV[0]; print WRITEFILE "$newlinen"; } elsif ($line =~ /DEFAULT_STOP_DATE/) { $newline = " " . $ARGV[1]; print WRITEFILE "$newlinen"; } else { print WRITEFILE "$linen"; } } close (WRITEFILE); }
<RequestSomething xmlns="http://something.com/accessservice"> <period xmlns=""> <start>2013-03-06T00:00:00</start> <stop>2013-03-07T00:00:00</stop> </period> ... The rest of the xml file... </RequestSomething>
在此先感谢,水晶
Django与Python的错误与诡计
Linux C / C ++套接字发送multithreading代码
使用linux-kernel模块发送UDP数据包而不使用套接字
embedded式linux上的getrusagefunction
为什么直到存在?
在linux重新启动时,神奇数字的目的是什么?
最大化MysqL分析服务器的内存使用率
你的脚本有几个问题。
1)由于附加的右括号而导致编译错误:
打开(WRITEFILE),“> $ file”)|| 死“无法打开| $文件|”;
应该写作
打开(WRITEFILE,“> $ file”)|| 死“无法打开| $文件|”;
2)你应该使用反引号代替单引号
@filenames = 'ls TC*';
否则@filenames将只包含字符串'ls TC *'而不是实际的文件名列表:
@filenames = `ls TC*`;
3)你确定perl解释器的路径是/usr/local/bin/perl吗? (尝试从命令行查看which perl来检查路径)。 如果不是,那么第一行应该改变。
4)该脚本将永远不会在您向我们显示的XML数据上工作,因为它被设计用来替换包含字符串DEFAULT_START_DATE和DEFAULT_STOP_DATE的行 (带有作为脚本参数提供的日期)。 这些字符串不会显示在您向我们显示的数据中。
但是,如果XML文件是这样的话,该脚本将工作:
<RequestSomething xmlns="http://something.com/accessservice"> <period xmlns=""> <start> DEFAULT_START_DATE </start> <stop> DEFAULT_STOP_DATE </stop> </period> ... The rest of the xml file... </RequestSomething>
我希望这可以帮助你实现它,但无论如何,我会建议你重写脚本,因为它使用非常不可靠和危险的方式来更改XML文件。
因为你想要做的事情相对简单,你不需要把它当作一个.xml。 我会像你一样对待它,以免混淆。 对于你这样做,似乎Tie :: File是一个很好的选择。 例如:
的test.xml:
<RequestSomething xmlns="http://something.com/accessservice"> <period xmlns=""> <start>2013-03-06T00:00:00</start> <stop>2013-03-07T00:00:00</stop> </period> ... The rest of the xml file... </RequestSomething>
码:
use Tie::File; use strict; use warnings; my @ra=(); tie @ra,'Tie::File',"test.xml" or die; my $length=scalar(@ra); for (my $i=0; $i < $length; $i++) { if ($ra[$i] =~ /(s*)<start>.*</start>/) { $ra[$i]="$1<start>$ARGV[0]</start>"; } elsif ($ra[$i] =~ /(s*)<stop>.*</stop>/) { $ra[$i]="$1<stop>$ARGV[1]</stop>"; } }
使用Tie :: File,你可以进入你的文件,并使用一个数组来访问/修改其内容。 (s*)<stop>.*</stop>基本上做了以下操作:( s *)将所有空间提取到$ 1之前。 <stop>.*</stop>在它们之间查找带有任何非换行符的停止标签。 一旦我们知道我们在正确的路线,我们只需要修改数组,直接改变这个文件。 我们把$ 1放在那里以保持缩进。
这里新的test.xml当我执行perl test.pl 1am 2pm:
<RequestSomething xmlns="http://something.com/accessservice"> <period xmlns=""> <start>1am</start> <stop>2pm</stop> </period> ... The rest of the xml file... </RequestSomething>
你可以添加选项来遍历所有必要的文件,只要确保在每个文件之后,你重置你的数组,即@ ra =(); 祝你好运。 希望这可以帮助!
编辑:看到解开阵列评论,你也应该这样做。
为什么不使用XML解析器? 你不能从那台机器上的CPAN安装吗?
如果文件不是很大,可以使用XML::Simple ,否则使用XML::Simple XML::Twig – 尽管回调处理程序可能会非常棘手,如果您不习惯。
use XML::XPath; use DateTime; my $xp = XML::XPath->new(filename => 'input.xml'); $xp->setNodeText('/RequestSomething/period/start',DateTime->Now->strftime("%FT%T")); $xp->setNodeText('/RequestSomething/period/stop',DateTime->Now->add(days=>1)->strftime("%FT%T")); open my $fh,'>','output.xml' or die "$!"; print $fh $xp->getNodeAsXML(); close $fh;
我用DateTime来设置当前的日期,但你当然可以没有它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。