SED命令无法在perl脚本中运行

时间:2013-06-21 11:21:05

标签: perl unix

当我在命令行中使用“sed”时,它正在工作,但不包含在perl脚本中。

一个例子是 sed's / \ s + // g'aaa> bbb

但是当我试图通过perl脚本调用相同的命令时

$gf = `sed 's/\s\+//g' aaa > bbb` ;

输出文件与输入文件保持一致!!!!请建议。

3 个答案:

答案 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`;