Execute o comando sed no script perl

4

Não consigo invocar o comando sed do script perl como abaixo:

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

Abaixo está o erro:

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.

Eu preciso remover o <shortname>u********.com</shortname> no arquivo e salvar a saída em um novo arquivo. Quais comandos eu preciso executar?

    
por Sujju 30.10.2017 / 17:04

1 resposta

15

Ignorando por enquanto o fato de que perl pode fazer melhor qualquer coisa que sed possa fazer, aqui para citar a linha de comando shell para passar para system() , o melhor seria usar o tipo de aspas q{...} :

my $cmd = q{sed 's/...........//;s/............$//' a_file.txt >> a_newfile.txt};

(assumindo que a parte ... não contenha% desequilibrada{ / } , se isso acontecer, você pode usar q@...@ , q[...] , q(...) ...).

Como você deseja que um shell interprete essa linha de comando (para o redirecionamento >> ), você deseja que $cmd seja escalar, não array (de qualquer maneira, as matrizes são nomeadas @cmd , não $cmd ).

Para perl executar o comando sed sozinho, ou seja, sem invocar um shell, você faria:

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

Entretanto, você precisará fazer o redirecionamento de stdout em perl de antemão. Como:

open STDOUT, '>>', 'a_newfile.txt' or die "open: $!"

Para fazer a coisa toda em 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;
    
por 30.10.2017 / 17:19

Tags