Bash
為什麼a-z一種−和a-z星號匹配號碼?
我在目前路徑有 3 個目錄。
$ls a_0db_data a_clean_0db_data a_clean_data $ls a_*_data a_0db_data: a_clean_0db_data: a_clean_data: $ls a_[a-z]*_data a_clean_0db_data: a_clean_data:
我希望最後一個 ls 命令只匹配
a_clean_data
。為什麼它也與包含的匹配0
?bash --version GNU bash, version 4.2.24(1)-release (i686-pc-linux-gnu)
零件與
[a-z]
數字不匹配;這是*
. 您可能會混淆 shell萬用字元和正則表達式。
grep
接受各種風格的正則表達式之類的工具(預設為基本,-E
用於擴展,-P
用於Perl 正則表達式)例如(
-v
反轉匹配)$ ls a_[a-z]*_data | grep -v "[0-9]" a_clean_data
如果你想使用 bash 正則表達式,這裡有一個關於如何測試變數
$ref
是否為整數的範例:re='^[0-9]+$' if ! [[ $ref =~ $re ]] ; then echo "error" fi
所以問題是:為什麼
a_[a-z]*_data
匹配a_clean_0db_data
?這可以分為四個部分:
a_
匹配 的開頭a_clean_0db_data
,留下clean_0db_data
待匹配[a-z]
匹配範圍內的任何字元a-z
(例如c
),留下lean_0db_data
待匹配*
匹配任意數量的字元,例如lean_0db
_data
匹配尾隨_data
在正則表達式中,
[a-z]*
表示a..z 範圍內的任意數量的字元(包括零),但您處理的是 shell 萬用字元,而不是正則表達式。如果你想要正則表達式,一些
find
實現有一個-regex
謂詞:find . -maxdepth 1 -regex "^.*/a_[a-z]*_data$"
此處僅用於將
-maxdepth
搜尋結果限制為您所在的文件夾。正則表達式匹配整個文件名,因此我添加了一個^.*/
匹配路徑部分