当我在命令行中使用“sed”时,它正在工作,但不包含在perl脚本中。
一个例子是 sed's / \ s + // g'aaa> bbb
但是当我试图通过perl脚本调用相同的命令时
$gf = `sed 's/\s\+//g' aaa > bbb` ;
输出文件与输入文件保持一致!!!!请建议。
答案 0 :(得分:4)
在Perl中,反引号具有与双引号字符串相同的转义和插值规则:形成未知转义码的反斜杠会忘记反斜杠,例如: "\." eq "."
。
因此,Perl代码
print `echo \"1\"`;
print `echo \\"1\\"`;
输出
1
"1"
如果要将sed
命令嵌入到Perl中,则必须转义反斜杠,以便它们甚至可以到达sh
:
$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} $_;
}
答案 1 :(得分:0)
在这些奇怪的情况下,我确保我正在运行正确的命令。我将构造它,存储它,然后输出命令,这样我就能看到我创建的内容:
my $command = '....';
print "Command is [$command]\n";
my $output = `$command`;
如果你从Perl运行sed
,你可能会做错了,因为Perl已经可以做到这一切。
答案 2 :(得分:-2)
use strict;
use warnings;
位于文件顶部?
你可能需要反引号才能执行命令
$gf = `sed 's/\s\+//g' aaa > bbb`;