0

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

`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 新手

4

4 回答 4

2

仅当字符串不匹配时才应进行替换:

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

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

于 2012-08-29T07:09:03.437 回答
1

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

perl -ne 'print unless /^\*/' filename
于 2012-08-29T07:53:06.457 回答
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 个或多个右方括号:[.、、[.][.]]。我怀疑这不是你想要的。

于 2012-08-29T07:12:43.723 回答
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。

于 2012-08-29T07:51:46.110 回答