如何避免在文件中替换字符串时解析注释行?

时间:2012-08-29 07:04:15

标签: regex perl

我无法避免在文件中的字符串替换期间解析注释行(以*开头的行)。请帮我处理我的代码。

`perl -pi.bak -e "$_ =~/[#.*]*/; /s/PATTERN/REPLACEMENT STRING/g" Test.txt`;

我在Eclipse,Windows XP中使用Perl。

我收到以下错误消息:

Number found where operator expected at -e line 6, near "*    LAST UPDATED 09/15"
(Might be a runaway multi-line // string starting on line 1)
(Missing operator before 15?)
Bareword found where operator expected at -e line 6, near "1994 AT"
(Missing operator before AT?)

先谢谢, Perl Newbie

4 个答案:

答案 0 :(得分:2)

只有在字符串不匹配时才应进行替换:

perl -pi.bak -e "s/PATTERN/REPLACEMENT STRING/g unless /^#/" Test.txt

此外,您似乎正在尝试从Perl调用Perl。这通常比在原始程序中处理文件慢。

答案 1 :(得分:1)

我用它来跳过与正则表达式相匹配的行

perl -ne 'print unless /^\*/' filename

答案 2 :(得分:0)

如果您匹配评论,请使用next跳过以下代码:

perl -i.back -p -e'next if /^#/; s/PATTERN/REPLACEMENT STRING/' Test.txt

更新:现在正如choroba建议的那样,您可能应该在主代码中完成所有内容,而不是启动单独的Perl实例并且必须处理引号:

my $file= 'Test.txt';
my $bak= "$file.bak";

rename $file, $bak or die "cannot rename $file into $bak: $!";;

open( my $in,  '<', $bak)  or die "cannot open $bak: $!";
open( my $out, '>', $file) or die "cannot create $file: $!";

while( <$in>)
  { if( ! /^\*/) # note the backslash here, * is a meta character
      { s/PERFORM \Q$func[5]\E\[\.\]*/# PERFORM $func[5]\.\n $hash{$func[5]}/g; }
    print {$out} $_;
  }
close $in; 
close $out;

请注意,$func[5]可以(可能)包含元字符,因此我使用\Q\E来逃避它们。

我不确定\[\.\]*部分,它与正方括号,点和0个或更多结束方括号匹配:[.[.]或{{ 1}}。我怀疑那不是你想要的。

答案 3 :(得分:0)

如果您尝试跳过任何以'*'开头的行作为注释,请尝试此操作:

perl -pi.bak -e "s/PATTERN/REPLACEMENT STRING/g unless /^\*/" Test.txt

处理这样的文件时:

* this is a comments: AAA => BBB
AAA
AAB
ABB
BBB

运行

perl -pi.bak -e "s/AAA/BBB/g unless /^\*/" Test.txt

你会得到

* this is a comments: AAA => BBB
BBB
AAB
ABB
BBB

只会替换正常情境中的AAA。