在 perl 脚本中运行 sed 命令

在 perl 脚本中运行 sed 命令

我无法从 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;

相关内容