2012-03-23 38 views
34

我有這個簡單的任務麻煩的命令使用管道:作爲參數的差異

cat file | grep -E ^[0-9]+$ > file_grep 
diff file file_grep 

問題是,我想這樣做沒有file_grep

我曾嘗試:

diff file `cat file | grep -E ^[0-9]+$` 

and

diff file "`cat file | grep -E ^[0-9]+$`" 

和其他一些組合:-)但我無法讓它工作。 當diff獲得額外的參數時,我總是收到一個錯誤,這是由grep過濾的文件內容。

同樣的事情也總是爲我工作,當我(使用反引號轉義)想echo命令輸出從這樣的腳本中:

echo `ls` 

感謝

回答

38

如果你正在使用bash:

diff file <(grep -E '^[0-9]+$') file 

<(COMMAND)序列擴展到一個僞文件(如/dev/fd/63),從中可以讀出命令的輸出的名稱。

但是對於這個特殊情況,ruakh的解決方案更簡單。它利用-作爲diff的參數使其讀取其標準輸入。所述<(COMMAND)語法變得更加有用當兩個參數來diff是命令輸出,如:

diff <(this_command) <(that_command) 
35

最簡單的方法是:

grep -E '^[0-9]+$' file | diff file - 

連字符-作爲文件名是一個特定的表示法,它告訴diff「使用標準輸入」 ;它記錄在diff手冊頁中。 (大多數公用實用程序支持相同的表示法。)

反引號不起作用的原因是它們捕獲命令的輸出並將它作爲參數傳遞給。例如,這樣的:

cat `echo file` 

是相同的:

cat file 

這:

diff file "`cat file | grep -E ^[0-9]+$`" 

相當於是這樣的:

diff file "123 
234 
456" 

也就是說它實際上試圖通過123234345(加上換行符)作爲的文件名,而不是的內容的文件。從技術上講,你可以通過使用bash的「進程替換」功能,實際上創造了某種臨時文件的實現後者:

diff file <(cat file | grep -E '^[0-9]+$') 

,但它並不需要你的情況,因爲diff的爲-支持。

+0

感謝您的幫助:-) – rluks 2012-03-23 23:06:36

+0

@ Pan.student:不客氣! – ruakh 2012-03-23 23:08:26

+0

我可以像這樣把整個命令放在測試中嗎? 'if [-z grep -E'^ [0-9] + $'file | diff文件 - ];然後 echo「matches」 fi' – rluks 2012-03-23 23:11:50

3

在bash,語法是

diff file <(cat file | grep -E ^[0-9]+$) 
4

嘗試過程取代:

$ diff file <(grep -E "^[0-9]+$" file) 

從bash的手冊頁:

進程替換

在支持命名管道(FIFO)的系統上支持進程替換或命名打開文件的 的/ dev/fd方法。它採取<(列表)或>(列表)的形式。進程列表在其輸入或 輸出連接到FIFO或/ dev/fd中的某個文件時運行。該文件的名稱作爲參數傳遞給作爲擴展結果的當前命令的 。如果使用>(列表)表格,寫入文件 將爲列表提供輸入。如果使用<(列表)形式,則作爲參數傳遞的文件應該被讀爲 以獲取列表的輸出。

+0

也適用,謝謝 – rluks 2012-03-23 23:08:07

7
grep -E '^[0-9]+$' file | diff - file 

其中-是指 「從標準輸入讀取」。