0

我想要以下更改:

原来的 :

Format="%05dA1"
StartValue="2"
Format="%05dB1"
StartValue="2"
Format="%05dC1"
StartValue="2"

修改的:

Format="%05dA2"
StartValue="2"
Format="%05dB2"
StartValue="2"
Format="%05dC2"
StartValue="2"

我尝试了以下正则表达式,但无法得到我想要的。

$main_course =~ s/05d\w{2}\d{1}/05d\w{2}$name/g
4

5 回答 5

5

我担心人们正在为此苦苦挣扎。如果您正在运行 Perl 5 版本 10 或更高版本(并且您应该这样做,因为它已经超过 5 年了),那么您可以有用地使用K在进行替换时将任何内容保留在左侧的\K序列。

use strict;
use warnings;

while (<DATA>) {
  s/%05[a-z]{2}\K(\d)/$1+1/gie;
  print;
}

__DATA__
Format="%05dA1"
StartValue="2"
Format="%05dB1"
StartValue="2"
Format="%05dC1"
StartValue="2"

输出

Format="%05dA2"
StartValue="2"
Format="%05dB2"
StartValue="2"
Format="%05dC2"
StartValue="2"

如果您被旧版本的 Perl 卡住,那么只需捕获第一部分并将其放回原处

s/(%05[a-z]{2})(\d)/$1.($2+1)/gie;
于 2013-06-10T13:27:03.670 回答
0

将最后一个数字增加1

perl -pe 's| (%.+) (\d)|$1. ($2+1)|xe' input_file
于 2013-06-10T12:42:44.707 回答
0

使用 4 参数substr。例如,要将后面的单个数字05d和 2 个单词字符替换为 的内容$StartValue,您可以执行以下操作:

$Format =~ m/05d\w{2}\d/; substr( $Format, $-[0] + 5, 1, $StartValue );

初始调用m//将数组加载到@-匹配的位置,并substr替换适当的子字符串。

于 2013-06-10T13:00:00.063 回答
0

什么地方出了错?

  • 您的正则表达式05d\w{2}\d{1}匹配 6 个字符,因此它不会匹配05dA1和 co,您可能想要05d\w\d05\w{2}\d({1}是不必要的)。

  • 的替换端s也不是正则表达式,因此\w{2}表示转义序列\w(或文字w,如果不存在此类序列)后跟用2大括号括起来的文字。

如果您想在替换端重用捕获的字符串,您可以使用捕获组,例如$1,或其他特殊变量,例如$&(注意:perlre 提到使用$&“可能会大大减慢您的程序”)。

对于 Perl v5.10 及更高版本,您可以这样做

$main_course =~ s/05d\w\K\d/$name/g
  • \K是一个后向断言,这意味着匹配的子字符串05d\w不包含在要替换的字符串中s
于 2013-06-10T13:14:08.840 回答
0
perl -pe 's/(Format.*[A-Z])(\d+)/$1.($2+1)/ge;' your_file

测试:

> cat temp
Format="%05dA1"
StartValue="2"
Format="%05dB1"
StartValue="2"
Format="%05dC1"
StartValue="2"
> perl -pe 's/(Format.*[A-Z])(\d+)/$1.($2+1)/ge;' temp
Format="%05dA2"
StartValue="2"
Format="%05dB2"
StartValue="2"
Format="%05dC2"
StartValue="2"
> 
于 2013-06-10T13:40:50.427 回答