我正在尝试在perl脚本中运行以下命令:
#!/usr/bin/perl
my $cmd3 =`sed ':cycle s/^\(\([^,]*,\)\{0,13\}[^,|]*\)|[^,]*/\1/;t cycle' file1 >file2`;
system($cmd3);
但不产生任何输出或任何错误。 虽然当我从命令行运行命令时,它正常工作并提供所需的输出。你能帮助我在这里做错吗? 感谢
答案 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
中的(可能部分替换的)文字。