在perl脚本中运行sed命令时出错

时间:2015-04-16 12:08:08

标签: perl shell awk sed

我正在尝试在perl脚本中运行以下命令:

#!/usr/bin/perl

my $cmd3 =`sed ':cycle s/^\(\([^,]*,\)\{0,13\}[^,|]*\)|[^,]*/\1/;t cycle' file1 >file2`;
 system($cmd3);

但不产生任何输出或任何错误。 虽然当我从命令行运行命令时,它正常工作并提供所需的输出。你能帮助我在这里做错吗? 感谢

3 个答案:

答案 0 :(得分:1)

system()不会返回输出,只有exit状态。

答案 1 :(得分:1)

要查看输出,请打印$cmd3

my $cmd3 = `sed ':cycle s/^\(\([^,]*,\)\{0,13\}[^,|]*\)|[^,]*/\1/;t cycle' file1 >file2`;
print "$cmd3\n";

修改
如果要检查异常返回值,请使用CPAN模块IPC::System::Simple

use IPC::System::Simple qw(capture);

my $result = capture("any-command"); 

答案 2 :(得分:0)

从Perl内部运行sed只是疯了。

#!/usr/bin/perl

open (F, '<', "file1") or die "$O: Could not open file1: $!\n";
while (<F>) {
    1 while s/^(([^,]*,){0,13}[^,|]*)\|[^,]*/$1/;
    print;
}

请注意Perl与sed正则表达式方言的不同之处在于,分组括号和替换是未转义的,而文字圆括号或管道符号需要反斜杠转义(或以其他方式制作成文字,例如把它放在角色类中)。此外,替换的右侧更喜欢$1(如果您use warnings并且替换中有\1,您会收到警告;从技术上讲,在此级别,它们是等效的)

man perlrun有一个片段,解释了如果你确实需要在脚本中实现-i选项,但它相当繁琐。 (搜索第一次出现的“LINE:”,它是您想要的代码的一部分。)

但是,如果要在原地修改file1,并将其作为唯一的命令行参数传递给Perl脚本,则可以简单地说$^I = 1;(或{{1}你可以说use English;)。请参阅man perlvar

顺便说一下,你的代码“没有产生任何输出”的评论并不完全正确。它做你要求的;但你显然是在寻找错误的东西。

在反引号中引用命令会执行该命令。所以

$INPLACE_EDIT = 1;

在子shell中运行my $cmd3 = `sed ... file1 >file2`; 命令,然后使用sed的输入,并重定向到file1。由于重定向,此管道的输出是空的,即空字符串file2,它被分配给"",然后您完全不必要地尝试传递给$cmd3

也许您希望将system命令放在常规引号而不是反引号中(以便sed命令行为sed的值,然后通过它才有意义到$cmd3)。但由于重定向,它仍然不会产生任何可见的输出;它会创建system,其中包含file2中的(可能部分替换的)文字。