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>파일에서 .in을 삭제하고 출력을 새 파일에 저장해야 합니다 . 실행하려면 어떤 명령이 필요합니까?

답변1

지금은 perl더 나은 결과를 얻을 수 있다는 사실을 무시하고, 다음은 인용 유형을 사용하여 sed쉘 명령줄에 전달할 인용문입니다 .system()q{...}

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

( ...섹션에 불균형 {/ 가 포함되어 있지 않다고 가정하고 }있으면 , , ...을 사용할 수 q@...@있습니다 q[...]. q(...))

실제로 명령줄이 쉘에 의해 해석되기를 원하기 때문에(리디렉션을 위해 ) 배열이 아닌 스칼라가 되기를 >>원합니다 (어쨌든 배열의 이름은 바로 이 것입니다 ) .$cmd@cmd$cmd

perl명령을 단독으로 실행 하려면 sed(즉, 쉘을 호출하지 않고) 다음을 수행해야 합니다.

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;

관련 정보