【问题标题】:SED command not working in perl scriptSED 命令在 perl 脚本中不起作用
【发布时间】:2013-06-21 19:52:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能给出一个完整的例子,包括 perl 脚本和变量 aaa 的值 - 它是如何输入的?你知道\s+\s\+不一样吧?
  • 谢谢..我认为下面给出的以下答案是我正在寻找的..

标签: perl unix


【解决方案1】:

在 Perl 中,反引号与双引号字符串具有相同的转义和插值规则:形成未知转义码的反斜杠会忘记反斜杠,例如"\." eq ".".

因此,Perl 代码

print `echo \"1\"`;
print `echo \\"1\\"`;

输出

1
"1"

如果您想将 sed 命令嵌入到 Perl 中,您必须转义反斜杠,以便它们甚至到达 shell:

$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} $_;
}

【讨论】:

  • 非常感谢 amon.... 我在这上面浪费了 3 多个小时,而您在 1 分钟内解决了这个问题。非常感谢
  • 您的意思是sed sed 还是误入了错误?如果不是错字,你能解释一下为什么连续两个seds 吗?除了那个非常好的和清晰的解决方案!
  • @Floris 感谢您发现重复项。
  • 这对于处理需要 GNU sed 并且您可能正在部署到具有例如 BSD sed 的平台的情况非常有帮助。
【解决方案2】:

在这些奇怪的情况下,我确保我正在运行正确的命令。我将构建它、存储它并输出命令,这样我就可以准确地看到我创建的内容:

my $command = '....';
print "Command is [$command]\n";
my $output = `$command`;

如果您从 Perl 运行 sed,您可能做错了,因为 Perl 已经可以做到所有这些。

【讨论】:

    【解决方案3】:

    你有吗

      use strict;
      use warnings;
    

    在文件的顶部?

    你可能需要反引号来执行命令

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

    【讨论】:

      猜你喜欢
      • 2013-12-04
      • 2018-03-25
      • 2016-09-06
      • 2018-08-17
      • 2017-03-05
      • 2017-03-15
      • 2018-01-08
      • 2014-02-18
      • 2020-08-10
      相关资源
      最近更新 更多