我无法避免在文件中的字符串替换期间解析注释行(以*开头的行)。请帮我处理我的代码。
`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
答案 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。