在 perl 脚本中运行 sed 命令

Suj*_*jju 4 sed perl

我无法从 perl 脚本调用 sed 命令,如下所示:

#!/usr/bin/perl 
my $cmd = ('sed 's/...........//;s/............$//' a_file.txt >> a_newfile.txt');
  system($cmd);
Run Code Online (Sandbox Code Playgroud)

下面是错误:

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.
Run Code Online (Sandbox Code Playgroud)

我需要删除<shortname>u********.com</shortname>文件中的 并将输出保存在新文件中。我需要运行哪些命令?

Sté*_*las 15

现在忽略perl可以做得更好的事实sed,这里引用 shell 命令行传递给 system(),最好使用q{...}引号的类型:

my $cmd = q{sed 's/...........//;s/............$//' a_file.txt >> a_newfile.txt};
Run Code Online (Sandbox Code Playgroud)

(假设该...部分不包含不平衡的{/ },如果包含,您可以使用q@...@, q[...], q(...)...)。

因为您确实需要一个 shell 来解释该命令行(用于>>重定向),所以您希望$cmd成为一个标量,而不是数组(无论如何,数组的名称是@cmd,而不是$cmd)。

对于perl运行sed命令本身,即不调用外壳,你会怎么做:

my @cmd = ('sed', q{s/...........//;s/............$//}, 'a_file.txt');
system(@cmd);
Run Code Online (Sandbox Code Playgroud)

但是,您需要perl事先进行标准输出重定向。喜欢:

open STDOUT, '>>', 'a_newfile.txt' or die "open: $!"
Run Code Online (Sandbox Code Playgroud)

要在 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;
Run Code Online (Sandbox Code Playgroud)