Perl模式匹配和追加

时间:2012-12-18 09:01:44

标签: perl

在perl中我想实现以下翻译:

stmt1; gosub xyz;

stmt1; xyz();

我该怎么做?

3 个答案:

答案 0 :(得分:1)

从要编辑的文件的命令行运行(替换file.ext):

perl -i.bk -pe 's/gosub (.*?);/$1()/g' file.ext

答案 1 :(得分:1)

已经给出的答案提供了近似答案,这将处理您的边缘情况(缺少分号,分号后的附加条款)。

perl -plwe 's/\bgosub\s+([^;]+)/$1()/g'

它将匹配gosub关键字之后的任何字符序列,后跟“非分号”的空格并删除它们。我还添加了/g全局修饰符,因为您可能希望在一行上完成所有替换。请注意使用字边界\b来阻止部分匹配,例如不能替换legosub

如果单词边界不够,例如它会替换1.gosub,因为.会导致单词字符之间出现中断,您可以使用负面的lookbehind:

perl -plwe 's/(?<![^;\s])gosub\s+([^;]+)/$1()/g'

这要求gosub之前的任何字符都不是除分号或空格之外的任何字符。请注意,双重否定也允许不匹配(行首)。

答案 2 :(得分:0)

my $str = 'stmt1; gosub xyz;';
$str    =~ s/gosub (.*?);?/$1();/;

print $str;