
我有一個名為“test”的文件,其中包含
linux
Unixlinux
Linuxunix
it's linux
l...x
現在當我使用時grep '\<l.*x\>'
,它匹配:
linux
it's linux
l...x
但當我使用時grep '\<l*x\>'
,它只匹配:
l...x
,但根據參考指南,當使用 * 時,前面的項目將匹配零次或多次,即它應該匹配以 'l' 開頭並以 'x' 結尾的任何內容
誰能解釋為什麼它沒有顯示出預期的結果或我是否理解錯誤?
答案1
符號 (.*)
正規表示式 .* 和 * 中的 * 指的是計數,而不是每個字元的字元數,更準確地說,它的意思是“零個或多個”。此外,。方法'任何單一字元'。
所以當你把它們放在一起時你會得到'零個或多個任意字元'。例如像這樣的字串:
- 作業系統
- 林恩恩克斯
- lnx
- 嗨Linux
- 勒克斯
將匹配為<l.*x>
.最後一項很重要,它表明.*也無法匹配。
符號 (*)
正如我所說,單獨使用 * 是一個計數器。所以當你把它放在一個字母後面時,例如'l'* 是說'零個或多個 l'。
請注意,如果我們 grep for l*x
,這將匹配l...x
,但可能不是您想像的那樣。
% echo "l...x" | grep "l*x"
l...x
它匹配尾隨的“x”。除了「x」前面有「x」之外,「l」與匹配的原因無關'零個或多個 l'。
答案2
如果您想匹配以“l”開頭並以“x”結尾的任何內容,請嘗試正規表示式“l.*x”。這裡 ”。” 「*」和「*」分別是表示單一有效字元和長度至少為零的字元的特殊字元。這裡“*”之前是“.”,所以無論什麼都可以代替“.”。根據上面“*”的定義重複。
答案3
對於 shell(例如 bash),當小丑用於匹配檔案名稱時,*
和?
是字元本身 - 它們代表字元。
另一方面,對於正規表示式,*
, ?
, {n,m}
(出現範圍)和+
( egrep
only) 本身什麼都不是。它們總是引用前一個字符/原子 - 無論這是一個實際字符(例如L
或5
),.
(小丑)可以代表任何字符,一系列字符(例如[a-f]
)或多個字符的模式(僅限egrep;例如(abba)
- 其中“ abba」被視為一個單位)。因此,*
和?
本身並不代表任何東西,而是告訴我們前一個角色(對於任何一個或一組被視為一個單位的人來說可能是一個小丑)應該重複多少次。
一旦您記住了 shell 和正規表示式使用*
和 的方式之間的區別?
,它就應該明白了。
所以對於正規表示式:
.
- 準確地表示任意字元的一次出現a..a
- 匹配兩個 a 和其間任意類型的兩個字符.*
- 符合任何字元出現 0 次、1 次或多次B*
- 符合 0、1 或多次出現的“B”