2012-10-04 4 views
0

아래 perl grep regex이 있고 제대로 작동합니다.perl 시스템 grep 사용

my @cont = grep {/,\s*511747450\s*,\s*CAN2\s*$/} @fileContents; 

나는 유닉스 시스템 grep로 변환 할 나는 아래의 방법으로 system 명령을 사용하여 동일한 정규식을 시도하고 작동하지 않습니다.

my $cmd="grep ,\s*5117474501\s*,\s*CAN2\s*\$ " . $dirPath . "/" .$fileName; 
    my $exitStatus =system($cmd); 
+0

왜 그렇게 큰 따옴표를 사용합니까? – raina77ow

답변

6

\, *$은 쉘에 특수합니다. 좀 더 탈출하는 순서입니다.

use String::ShellQuote qw(shell_quote); 

my $pat = ',\\s*5117474501\\s*,\\s*CAN2\\s*$'; 

my $cmd = shell_quote('grep', '--', $pat, "$dirPath/$fileName"); 
my $exitStatus = system($cmd); 

또는 system의 다중 인수 형식을 사용하여 간단히 셸을 피할 수 있습니다.

my $pat = ',\\s*5117474501\\s*,\\s*CAN2\\s*$'; 

my @cmd = ('grep', '--', $pat, "$dirPath/$fileName"); 
my $exitStatus = system({ $cmd[0] } @cmd); 
+0

정보를 제공해 주셔서 감사합니다. 시스템 명령에 하나의 인수 또는 두 개의 인수 시스템이 사용됩니까 ({$ cmd [0]} @cmd); ? 인수에서 무엇이 전달되는지 설명해 주시겠습니까? 그것은 배열 또는 배열의 첫 번째 요소입니까? – Arav

+0

3 가지 형태가 있습니다. '시스템 $ 명령','시스템 $ 프로 그램 @ ARGS','시스템 프로 그램 $ 프로 그램, 프로 그램 @ ARGS' – ikegami

+0

. 예제는 시스템 {$ PROG} $ PROG, @ARGS? system ({$ cmd [0]} @cmd)은 인수에서 전달되는 내용을 이해할 수 없습니다. 인수에서 쉼표를 찾을 수 없기 때문에 배열 또는 배열 자체의 첫 번째 요소입니까? – Arav

3

grep은 일부 버전에서는 bash에서 \s과 작동하지 않습니다.

\s 대신 [:space:]을 시도하십시오.

grep의 동작은 버전에 따라 다릅니다.

+0

정보가 많이 필요합니다. – Arav