自动替换perl中字符串的数字

时间:2017-03-16 07:32:08

标签: perl

我有一个文件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);

请帮帮我。

2 个答案:

答案 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作为更好的输出。