在Bash中,當您鍵入ls *.out
時,它將輸出以.out
結尾的列表。這是一個正則表達式嗎?linux grep「* .out」和ls * .out
如果是;當我echo a.out > test
,然後鍵入grep *.out test
,它什麼都不輸出。
是*
在ls中的*
在正則表達式中嗎?
在Bash中,當您鍵入ls *.out
時,它將輸出以.out
結尾的列表。這是一個正則表達式嗎?linux grep「* .out」和ls * .out
如果是;當我echo a.out > test
,然後鍵入grep *.out test
,它什麼都不輸出。
是*
在ls中的*
在正則表達式中嗎?
默認情況下,grep會查找精確表達式,而不是正則表達式,但您可以通過添加-E
標誌來告訴它查找正則表達式。
因此,我認爲,你要找的是什麼grep -E *.out test
雖然研究在網絡上一點點就已經給你你想要的東西;)
如果你想在.out
結尾的所有文件進行搜索,試試grep <string> *.out
。您可能還想了解globbing。
要理解的主要問題是您的shell正在擴展程序參數(傳遞給main
執行程序的功能)。閱讀猛砸章關於shell expansions(和globbing)
所以,你不應該鍵入ls "*.out"
只是ls *.out
那麼/bin/ls
程序開始與擴張*.out
。舉例來說,如果你有文件a.out
,b.out
,,a.c
的*.out
(由shell完成)的擴展a.out
b.out
所以/bin/ls
得到"ls"
"a.out"
"b.out"
"cc.out"
其次NULL
其char**argv
第二個參數,它main
,與第一int argc
參數是4.
但grep
確實想要一些regular expression或「regexp」。你一般要引用它(避免 shell來嘗試它的擴展)。
這是一個可擴展的文件名描述的外殼,所以在這兩個ls *.out
和grep *.out test
殼填充文件名的命令行,命令本身只能看到所產生的名字的名單。假設你有文件名爲foo.out
和bar.out
,這些命令將相當於這些:
ls bar.out foo.out
grep bar.out foo.out test
第一個要求ls
列出文件,第二個要求grep命令來查找模式bar.out
中的文件foo.out
和test
。後者可能不是你想要的東西,所以引用模式的grep爲:
grep "*.out" test
除了這是不是一個真正的有效的正則表達式。在文件名中,星號*
匹配零個或多個字符,在正則表達式中它匹配零個或多個前一項(括號中的字符,字符組或表達式),但在行首沒有任何字符,所以表達毫無意義。 Perl抱怨說,grep
和sed
不這樣做,但它們似乎也不匹配任何東西。
在正則表達式中,點.
表示任何字符,因此需要從字面上進行轉義。而且,grep會在行中的任何位置找到匹配項,因此可以省略前導.*
(它可以匹配任意數量的任何字符)。因此,這將查找包含字符串.out
文件test
在行:
grep "\.out" test
正如我們看到的,被Bash和grep的使用模式(正則表達式)中使用的模式是不一樣的。見例如Bash's manual for the pattern matches used in filename expansion和man page regex(7)
for regular expressions。還要注意,正則表達式有不同的方言,它們並不完全相容。
檢查這些帖子:http://stackoverflow.com/questions/23702202/what-are-the-differences-between-glob-style-pattern-and-regular-expression和http://stackoverflow.com/questions/19673427 /正則表達式之間的差異 – codeforester
謝謝,這聽起來是我的盟友。 – suoyong