我无法从 perl 脚本调用 sed 命令,如下所示:
#!/usr/bin/perl
my $cmd = ('sed 's/...........//;s/............$//' a_file.txt >> a_newfile.txt');
system($cmd);
下面是错误:
String found where operator expected at ./test.pl line 2, near "s/............$//' a_file.txt >> a_newfile.txt'"
syntax error at ./test.pl line 2, near "'sed 's/...........//"
syntax error at ./test.pl line 2, near "s/............$//' a_file.txt >> a_newfile.txt'"
Execution of ./test.pl aborted due to compilation errors.
我需要删除<shortname>u********.com</shortname>
文件中的 并将输出保存在新文件中。我需要运行哪些命令?
答案1
现在忽略perl
可以做得更好的事实sed
,这里引用要传递给的 shell 命令行 system()
,最好是使用q{...}
引号类型:
my $cmd = q{sed 's/...........//;s/............$//' a_file.txt >> a_newfile.txt};
(假设该...
部分不包含不平衡{
/ }
,如果包含,则可以使用q@...@
, q[...]
, q(...)
...)。
因为您确实希望 shell 解释该命令行(用于>>
重定向),所以您希望$cmd
成为标量,而不是数组(无论如何,数组被命名为@cmd
,而不是$cmd
)。
要单独perl
运行sed
命令(即不调用 shell),您需要执行以下操作:
my @cmd = ('sed', q{s/...........//;s/............$//}, 'a_file.txt');
system(@cmd);
但是,您需要perl
事先进行标准输出重定向。喜欢:
open STDOUT, '>>', 'a_newfile.txt' or die "open: $!"
要在 perl 中完成整个事情:
open my $in, '<', 'a_file.txt' || die "open a_file: $!";
open my $out, '>>', 'a_newfile.txt' || die "open a_newfile: $!";
while (<$in>) {
s/...........//;s/............$//;
print $out $_;
}
close $in;
close $out;