다음과 같은 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;