我有一个文件test.xml
,如下所示:
<manifest XML:android="http://schemas.android.com/apk/res/android"
package="com.connect"
android:versionCode="32"
android:versionName="9.3.0.114" >
我想用脚本打开文件test.xml。
然后找到字符串android:versionName="9.3.0.114" >
以更新自动变为android:versionName="9.3.0.115" >
因此,最后一个从100到999开始的数字将+1
dy。
我尝试过类似下面但不正确的事情
#!/usr/bin/perl
my $test= "test.xml";
open my $fh,"<", "$test" or die $!;
while (my $srt = <$fh>) {
$str = "android:versionName=\"9.3.0.114\" >";
$str =~s/((?:[^\=]*)=\"(?:[^"]*)\.)(\d+)\"/my $ret = "$1".($2+1)."\""; ($ret);/ge;
print $srt;
}
close($fh);
请帮帮我。
答案 0 :(得分:2)
请 - 不要使用正则表达式来破解XML。它很脆弱。 XML是上下文的,而正则表达式则不是。
但使用真正的解析器非常容易:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> new -> parsefile ( 'test.xml')
foreach my $manifest ( $twig -> findnodes ( '//manifest' ) ) {
my @version = split /\./, $manifest->att('android:versionName');
$version[-1]++; #or whatever mechanism you want to use to update
$manifest -> set_att('android:versionName', join ".", @version );
}
$twig -> set_pretty_print('indented_a');
$twig -> print;
open ( my $output, '>', 'test_new.xml') or die $!;
print {$output} $twig -> sprint;
答案 1 :(得分:-2)
只是一个简单的正则表达式很好(我在这里更新了你的代码):
#!/usr/bin/perl
use Tie::File;
my $infile = 'test.xml';
my @lines;
tie(@lines, 'Tie::File', $infile) or die("can't open $infile: $!");
$srt = join "\n", @lines;
$srt=~s/(android\:versionName=\"(?:[^"]*)\.)(\d+)\"/my $ret = "$1".($2+1)."\""; ($ret);/ge;
@lines = split /\n/, $srt;
untie @lines;
输入test.xml
:
<manifest XML:android="http://schemas.android.com/apk/res/android"
package="com.connect"
android:versionCode="32"
android:versionName="9.3.0.114">
<manifest XML:android="http://schemas.android.com/apk/res/android"
package="com.connect"
android:versionCode="32"
android:versionName="9.3.0.200">
输出:
<manifest XML:android="http://schemas.android.com/apk/res/android"
package="com.connect"
android:versionCode="32"
android:versionName="9.3.0.115">
<manifest XML:android="http://schemas.android.com/apk/res/android"
package="com.connect"
android:versionCode="32"
android:versionName="9.3.0.201">
但是,如果您使用完全基于XML的流程,那么您将尝试XML::Twig
作为更好的输出。