Perl多行变量固定位置批量替换(无需逐行循环)
不用逐行遍历的Perl字符串批量替换方案
嘿,刚好碰到过类似需求!不用逐行遍历,直接用Perl的正则全局替换就能搞定,效率还高。
核心思路是用正则捕获每个数字串的前后固定部分,中间替换成你要的0004,而且通过/g修饰符一次性处理所有匹配项,完全不用循环遍历每一行。
具体实现代码
假设你的多行内容存在变量$str里,代码如下:
# 示例变量,多行内容 my $str = <<'END_CONTENT'; 2100010000 2200010000 2300010000 3100010001 3200010001 END_CONTENT # 关键替换语句,全局处理所有匹配项 $str =~ s/(\d{2})\d{4}(\d{4})/${1}0004$2/g; # 输出结果 print $str;
代码解释
(\d{2}):捕获每个10位数字串的前2位,存到捕获变量$1中\d{4}:匹配要替换的第3-6位(正好4个数字),这部分会被丢弃(\d{4}):捕获每个10位数字串的最后4位,存到捕获变量$2中${1}0004$2:替换后的内容是「前2位 + 0004 + 最后4位」,用${1}是为了避免和后面的0004混淆(不然Perl会把$10当成第10个捕获组)/g:全局替换修饰符,会一次性处理变量里所有符合模式的10位数字串,不管它们在同一行还是不同行
额外优化(可选)
如果你的变量里可能存在非10位的数字串,想要只替换每行恰好10位的数字,可以加上行锚点和多行修饰符:
$str =~ s/^(\d{2})\d{4}(\d{4})$/${1}0004$2/mg;
这里的/m修饰符让^和$匹配每行的开头和结尾,确保只替换整行都是10位数字的行。
运行后你就能得到想要的结果:
2100040000
2200040000
2300040000
3100040001
3200040001
内容的提问来源于stack exchange,提问作者user3433747
相关产品推荐
相关产品推荐

