2017-05-14 85 views
0

在Bash中,當您鍵入ls *.out時,它將輸出以.out結尾的列表。這是一個正則表達式嗎?linux grep「* .out」和ls * .out

如果是;當我echo a.out > test,然後鍵入grep *.out test,它什麼都不輸出。

*在ls中的*在正則表達式中嗎?

+1

檢查這些帖子:http://stackoverflow.com/questions/23702202/what-are-the-differences-between-glob-style-pattern-and-regular-expression和http://stackoverflow.com/questions/19673427 /正則表達式之間的差異 – codeforester

+0

謝謝,這聽起來是我的盟友。 – suoyong

回答

0

默認情況下,grep會查找精確表達式,而不是正則表達式,但您可以通過添加-E標誌來告訴它查找正則表達式。

因此,我認爲,你要找的是什麼grep -E *.out test雖然研究在網絡上一點點就已經給你你想要的東西;)

+0

謝謝,但是直接在前的*沒有什麼,'*'真的匹配了什麼? – suoyong

+3

不,默認情況下'grep'尋找與基本正則表達式(BRE)的匹配,'grep -F'(或'fg​​rep')查找固定字符串,並且'grep -E'(或'egrep')尋找擴展的正則表達式。 GNU grep的手冊頁提到了簡單的區別:http://man7.org/linux/man-pages/man1/grep.1.html – ilkkachu

1

如果你想在.out結尾的所有文件進行搜索,試試grep <string> *.out。您可能還想了解globbing

1

要理解的主要問題是您的shell正在擴展程序參數(傳遞給main執行程序的功能)。閱讀猛砸章關於shell expansions(和globbing

所以,你不應該鍵入ls "*.out"只是ls *.out那麼/bin/ls程序開始與擴張*.out。舉例來說,如果你有文件a.outb.out,​​,a.c*.out(由shell完成)的擴展a.outb.out​​所以/bin/ls得到"ls""a.out""b.out""cc.out"其次NULLchar**argv第二個參數,它main,與第一int argc參數是4.

grep確實想要一些regular expression或「regexp」。你一般要引用它(避免 shell來嘗試它的擴展)。

0
  1. 對於grep命令,*表示0或更多的prev /前面的字符或表達式的出現。所以在你的情況下,grep .out* test可以工作,因爲它會查找.ou後面跟零個或多個文件測試中任何字符的出現。

  2. 對於ls命令,ls *.out意味着列出所有以其名稱結尾的文件/文件夾,其名稱爲.out

+0

正則表達式'.out *'會在任何字符之後尋找'ou' ,例如''回合',''''或'〜ou'(它也會匹配任何數量的't's之後,但與常規grep,這意味着什麼。) – ilkkachu

+0

謝謝ikkikachu!這更有意義。我會編輯我的答案。 – YunujD

1

這是一個可擴展的文件名描述的外殼,所以在這兩個ls *.outgrep *.out test殼填充文件名的命令行,命令本身只能看到所產生的名字的名單。假設你有文件名爲foo.outbar.out,這些命令將相當於這些:

ls bar.out foo.out 
grep bar.out foo.out test 

第一個要求ls列出文件,第二個要求grep命令來查找模式bar.out中的文件foo.outtest 。後者可能不是你想要的東西,所以引用模式的grep爲:

grep "*.out" test 

除了這是不是一個真正的有效的正則表達式。在文件名中,星號*匹配零個或多個字符,在正則表達式中它匹配零個或多個前一項(括號中的字符,字符組或表達式),但在行首沒有任何字符,所以表達毫無意義。 Perl抱怨說,grepsed不這樣做,但它們似乎也不匹配任何東西。

在正則表達式中,點.表示任何字符,因此需要從字面上進行轉義。而且,grep會在行中的任何位置找到匹配項,因此可以省略前導.*(它可以匹配任意數量的任何字符)。因此,這將查找包含字符串.out文件test在行:

grep "\.out" test 

正如我們看到的,被Bash和grep的使用模式(正則表達式)中使用的模式是不一樣的。見例如Bash's manual for the pattern matches used in filename expansionman page regex(7) for regular expressions。還要注意,正則表達式有不同的方言,它們並不完全相容。