我想要进行以下更改:
原文:
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
答案 0 :(得分:5)
我担心人们正在努力解决这个问题。如果您运行的是Perl 5版本10或更高版本(并且您应该因为它已经超过五年了),那么您可以有效地使用 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;
答案 1 :(得分:0)
将最后一位数字增加1
perl -pe 's| (%.+) (\d)|$1. ($2+1)|xe' input_file
答案 2 :(得分:0)
使用4参数substr
。例如,要将05d
后面的单个数字和$StartValue
的内容替换为2个字符,您可以执行以下操作:
$Format =~ m/05d\w{2}\d/; substr( $Format, $-[0] + 5, 1, $StartValue );
对m//
的初始调用会在@-
数组中加载匹配位置,substr
会替换相应的子字符串。
答案 3 :(得分:0)
出了什么问题?
您的正则表达式05d\w{2}\d{1}
匹配6个字符,因此它与05dA1
和co不匹配,您可能需要05d\w\d
或05\w{2}\d
({{1}是不必要的。)
{1}
的替换方也不是正则表达式,因此s
表示转义序列\w{2}
(如果不存在此类序列,则为文字\w
)用括号括起来的文字w
。
如果要在替换方重用捕获的字符串,可以使用捕获组,例如2
或其他特殊变量,例如$1
(注意:使用$&
提及“可能会大大减慢您的计划”。)
对于Perl v5.10及更高版本,您可以执行此操作
$&
$main_course =~ s/05d\w\K\d/$name/g
是一个lookbehind断言,这意味着\K
匹配的子字符串不包含在要由05d\w
替换的字符串中答案 4 :(得分: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"
>