Bash

為什麼a-z一種−和a-z星號匹配號碼?

  • September 12, 2014

我在目前路徑有 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搜尋結果限制為您所在的文件夾。正則表達式匹配整個文件名,因此我添加了一個^.*/匹配路徑部分

引用自:https://unix.stackexchange.com/questions/154747