如何更改perl文件中匹配字符串中的子字符串

时间:2013-06-10 12:33:51

标签: regex perl

我想要进行以下更改:

原文:

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

5 个答案:

答案 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\d05\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"
> 
相关问题