정규식은 쉘에서 작동하지만 Perl 스크립트를 통해서는 작동하지 않습니다.

정규식은 쉘에서 작동하지만 Perl 스크립트를 통해서는 작동하지 않습니다.

Unix 쉘을 통해 Perl 스크립트를 실행하기 위해 Perl 명령을 사용하는 system데 문제가 있습니다 .
Unix에서 Perl로 변환하기 위해 적절하게 조정해야 하는 더 복잡한 정규식 명령이 있고 잘 작동하지만 여기서 누락된 것이 무엇인지 알 수 없는 것 같습니다.
Mobaxterm v7.1 및 Putty 0.60을 사용하여 테스트했습니다.

파일( file.txt)이 있습니다.

23445 dir1/dir2/dir3
21343 dir1/dir2/dir3/dir4/file.B2
54322 dir1/dir2/dir3/file3.P
53223 dir1/dir2/dir3/dir4/dir5
23412 dir1/dir2/dir3/dir4/dir5/file5.xsd
54166 dir1/dir2/file6.AB
64544 dir1/dir2/fil7.ABE

grep이 파일에서는 파일의 행(디렉토리 제외: 행 1 및 4)만 포함하고 이를 새 파일에 저장하려고 합니다 .

system("grep '^.*\.[a-zA-Z0-9][a-zA-Z0-9]*\$' file.txt > file2.txt");

file2.txt아무것도 변경되지 않았 file.txt으며 디렉토리는 여전히 포함되어 있습니다.

그러나 이 명령은 Unix 셸을 통해 실행됩니다(앞의 백슬래시 없음 $).

grep '^.*\.[a-zA-Z0-9][a-zA-Z0-9]*$' file.txt > file2.txt

file2.txt산출:

21343 dir1/dir2/dir3/dir4/file.B2
54322 dir1/dir2/dir3/file3.P
23412 dir1/dir2/dir3/dir4/dir5/file5.xsd
54166 dir1/dir2/file6.AB
64544 dir1/dir2/fil7.ABE

물론 $Perl이 이를 알 수 없는 문자열로 읽지 않도록 Perl 시스템 명령에서 문자를 이스케이프 처리해야 했습니다. 그 외에도 어떤 다른 시스템 명령을 조정해야 합니까?

답변1

큰따옴표에는 백슬래시가 필요합니다. 즉, 점 앞에 백슬래시를 두 배로 입력합니다.

system("grep '^.*\\.[a-zA-Z0-9][a-zA-Z0-9]*\$' file.txt > file2.txt");
#                ^
#                |
#              Here.

관련 정보