当我在命令行中使用“sed”时,它正在工作,但当包含在 perl 脚本中时却没有。
一个例子是 sed 's/\s+//g' aaa > bbb
但是说当我试图通过 perl 脚本调用相同的命令时
$gf = `sed 's/\s\+//g' aaa > bbb` ;
输出文件与输入文件相同!!!!请建议。
在 Perl 中,反引号与双引号字符串具有相同的转义和插值规则:形成未知转义码的反斜杠会忘记反斜杠,例如"\." eq "."
.
因此,Perl 代码
print `echo \"1\"`;
print `echo \\"1\\"`;
输出
1
"1"
如果您想将该sed
命令嵌入到 Perl 中,您必须转义反斜杠,以便它们甚至可以到达sh
ell:
$gf = `sed 's/\\s\\+//g' aaa > bbb`;
实际上,当您将输出重定向到文件时,您不会得到任何输出$gf
。我们可以做
use autodie;
system "sed 's/\\s\\+//g' aaa > bbb";
或单引号:
use autodie;
system q{ sed 's/\s\+//g' aaa > bbb };
保留反斜杠。
尽管如此,这是非常不必要的,因为 Perl 可以自己应用替换。
use autodie; # automatic error handling
open my $out, ">", "bbb";
open my $in, "<", "aaa";
while (<$in>) {
s/\s\+//g; # remove all spaces followed by a plus
print {$out} $_;
}
在这些奇怪的情况下,我确保我正在运行正确的命令。我将构建它、存储它并输出命令,这样我就可以准确地看到我创建的内容:
my $command = '....';
print "Command is [$command]\n";
my $output = `$command`;
如果你sed
从 Perl 运行,你可能做错了,因为 Perl 已经可以做到这一切。
你有吗
use strict;
use warnings;
在文件的顶部?
你可能需要反引号来执行命令
$gf = `sed 's/\s\+//g' aaa > bbb`;