shell 中的正規表示式

shell 中的正規表示式

我有兩個關於在 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

相關內容