我有兩個關於在 shell 中使用正規表示式的問題。
1. * 的使用
*:星號表示前面的元素有零個或多個。例如,ab*c 符合「ac」、「abc」、「abbc」、「abbbc」等。
但是,當我寫入時rm test*.iso
,它將刪除以“test”開頭並以“.iso”結尾的所有文件,無論“test”和“.iso”之間有(或沒有)。所以,檔案「tes.iso」將是不是已刪除。
如果以 abc 為例,根據維基百科,「ab*c」符合「ac」。因此rm ab*c
應該刪除一個“ac”檔。為什麼 rm 不使用維基百科所描述的正規表示式?
2. 使用 - 和 ?
仍根據關於正規表示式的維基百科頁面:
?:問號表示前面的元素有0個或1個。例如,colour?r 符合“color”和“color”。
+:加號表示前面有一個或多個元素。例如,ab+c 符合「abc」、「abbc」、「abbbc」等,但不符合「ac」。
“?”看起來像“*”,也就是說“?”符號取代一個或零個元素(但不是前面的一個,與維基百科所說的相反)。
我不知道如何使用“+”,這是我的第二個問題。我也對有關正則表達式和rm, cp, ...
.
答案1
外殼的模式匹配符號描述於本標準文件。
正如該文件在其簡介中所說,模式比對表示法與正規表示式表示法相關,但略有不同。
特別是,?
在 shell 中的行為類似於.
正規表示式,而*
在 shell 中的行為類似於.*
正規表示式。 (但是它們都不會匹配.
檔案名稱開頭的 a。)+
shell 中沒有任何特殊的模式匹配能力。然而,正如 @HaukeLaging 在他的回答中所說,某些 shell 可以選擇啟用正規表示法,儘管這樣做是非標準的。
答案2
shell 僅在某些條件下使用正規表示式(不同 shell 可能有所不同)。
您bash
必須使用以下命令啟動它們:shopt -s extglob
之後你可以使用類似的東西:
echo a*(b)c
Pattern Matching
請參閱中的塊man bash
。