2012-10-04 58 views
0

有下面的perl grep regex它工作正常。使用perl系統grep

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

我想將其轉換爲UNIX系統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多ARG形式避免了殼。

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

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

非常感謝您的信息。系統命令帶有一個參數或兩個參數system({$ cmd [0]} @cmd); ?你能否向我解釋我在論據中通過了什麼。它是一個數組還是數組的第一個元素? – Arav

+0

三種是三種形式。 'system $ CMD','system $ PROG,@ ARGS','system {$ PROG} $ PROG,@ ARGS' – ikegami

+0

謝謝。該示例是否遵循system {$ PROG} $ PROG,@ARGS?系統({$ cmd [0]} @cmd)無法理解在參數中傳遞的內容。它是數組或數組本身的第一個元素,因爲我無法在參數中找到逗號。 – Arav

3

grep在某些版本中不能在bash中使用\s

嘗試[:space:]而不是\s

grep的行爲因不同版本而異。

+0

Thans很多信息。 – Arav