我是字符串来替换包含" /"的字符串;使用Perl,使用下面的代码
file.txt包含
/usr/open/xyz -getCh $svr
码
open(FILE, "</tmp/file.txt") || die "File not found";
my @lines = <FILE>;
close(FILE);
my $stringToReplace = "\/usr\/open\/xyz -getCh \$svr";
my $stringToReplaceWith = "echo \"y\" | \/usr\/open\/xyz -getCh \$svr";
my @newlines;
foreach(@lines) {
$_ =~ s/$stringToReplace/$stringToReplaceWith/g;
push(@newlines,$_);
}
open(FILE, ">/tmp/file.txt") || die "File not found";
print FILE @newlines;
close(FILE);
以上代码对我不起作用。
答案 0 :(得分:3)
关于代码的一些注意事项
始终 use strict
和use warnings 'all'
位于您编写的每个Perl程序的顶部
使用词法文件句柄和open
open
调用可能由于无法找到文件以外的其他原因而失败。错误消息位于$!
,您应该将其包含在die
字符串
使用单引号消除了字符串文字中大多数反斜杠的需要。正斜杠不需要在单引号或双引号内转义
您应use constant
定义常量值,尤其是如果您多次使用
使用Perl的许多操作符默认操作$_
不需要数组@newlines
。您仍在修改@lines
,因此@newlines
只是一个副本
在正则表达式模式或双引号字符串中使用\Q...\E
来转义每个非字母数字字符
最后一点将解决您的问题。正则表达式模式中的美元符号$
表示行的结束,如果您希望按字面意义删除,则需要进行转义
您的程序的这种变化正常工作
use strict;
use warnings 'all';
use constant FILE => '/tmp/file.txt';
my @input = do {
open my $fh, '<', FILE or die "Unable to open input file: $!";
<$fh>;
};
my $old = '/usr/open/xyz -getCh $svr';
my $new = 'echo "y" | ' . $old;
open my $fh, '>', FILE or die "Unable to open output file: $!";
for ( @input ) {
s/\Q$old/$new/g;
print $fh $_;
}
print "Changes complete\n";