2013-03-24 74 views
-2

這沒有爲grep的不工作

.config 
le-test.sh 
a b c 

.config 
le-test.sh 
a b c 

任何人我

grep -vE '^\..*' tmp1.txt >grep.txt 
grep -vE '^le-.*\.sh' grep.txt >tmp1.txt 

tmp1.txt之前的工作有所幫助?

+0

你想要的結果是什麼? – Daedalus 2013-03-24 22:02:17

+0

我想過濾le-test.sh和.config ... > a b c – 2013-03-24 22:04:37

+0

所以你不想要.config或le-test.sh? – Daedalus 2013-03-24 22:07:45

回答

1

這裏是grep的你會使用:grep -vE "^\.|^le-[^.]+\.sh" FILE

+0

這是**不是** 100%正確的OP的要求。例如還有另一行'foole-bar.sh',這行也會被過濾掉。從OP的代碼中,似乎他只是想讓'^ le -...'行被刪除。請修復它。 – Kent 2013-03-24 22:18:07

+0

@Kent - 好的。改變。 – Daedalus 2013-03-24 22:40:18

+0

僅供參考:您的正則表達式中的[[^。] +'部分意味着'le-foo.bar.sh'會逃脫您的過濾器。 – 2013-04-02 22:38:25

1

你看到了什麼,當你運行:

$ grep -vE '^\.' tmp1.txt 
le-test.sh 
a b c 
$ grep -E '^\.' tmp1.txt 
.config 
$ 

(上正則表達式尾隨.*不添加或刪除任何數據線) 。你應該看看我展示的是什麼;如果您確實沒有看到我展示的內容,那麼您需要開始查看grep版本對-E選項的作用。它應該啓用帶有擴展正則表達式的'egrep -mode',而不是擴展正則表達式。試試:

$ grep -e '^\.' tmp1.txt 
.config 
$ grep -ve '^\.' tmp1.txt 
le-test.sh 
a b c 
$ 

小寫-e簡單地說下一個參數是正則表達式。如果你仍然沒有得到顯示的輸出,那麼你可能沒有使用grep的普通版本。你需要檢查你正在運行的東西。您可以嘗試運行/usr/bin/grep或測試它是否爲具有grep --version等的GNU版本。

假設您可以獲得第一階段過濾所顯示的輸出,那麼第二階段也應該起作用。你說你想要消除'從le-開始並以.sh結尾的文件',但是你的第二個正則表達式只需要le-開始後的.sh;它沒有指定結束:悲痛

$ grep -vE '^\.' tmp1.txt | grep -E '^le-.*\.sh$' 
le-test.sh 
$ grep -vE '^\.' tmp1.txt | grep -vE '^le-.*\.sh$' 
a b c 
$ 

一個可能的原因是,如果您的數據文件了Windows行尾(CRLF),但你在UNIX上運行測試。正則表達式的\.sh$部分會失敗,因爲在行結束之前還有一個CR(回車,'\r')。但是,這不應該影響過濾器過程的第一部分。

你應該能夠做到這一切在一個命令:

$ grep -E '^(\.|le-.*.sh$)' tmp1.txt 
.config 
le-test.sh 
$ grep -vE '^(\.|le-.*.sh$)' tmp1.txt 
a b c 
$ 

這個版本確實需要-E標誌;交替|和分組的括號需要它。