現在のパスには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)
答え1
答え2
だから質問は:なぜa_[a-z]*_data
一致するのですかa_clean_0db_data
?
これは次のように分割できます。4つ部分:
a_
試合開始a_clean_0db_data
、clean_0db_data
マッチングのために去る[a-z]
範囲内のすべての文字a-z
(たとえばc
)と一致し、lean_0db_data
一致するように残します。*
任意の数の文字と一致します。lean_0db
_data
末尾の一致_data
正規表現では、[a-z]*
次のことを意味します。a..z 範囲の任意数の文字 (0 を含む)しかし、正規表現ではなくシェルワイルドカードを扱っています。
正規表現が必要な場合、一部のfind
実装には-regex
述語があります。
find . -maxdepth 1 -regex "^.*/a_[a-z]*_data$"
これにより、-maxdepth
検索結果が現在存在するフォルダにのみ制限されます。正規表現マッチみんな^.*/
ファイル名なので、パス部分と一致するように追加しました。
答え3
*
シェルパターンのゼロ個以上の文字と一致します。*
正規表現演算子と混同しないでください。0個以上の先行原子。
*
デフォルトのシェルモードにはregexpと同等のものはありません。ただし、さまざまなシェルにはその拡張機能があります。
ksh
持っている*(something)
:ls a_*([a-z])_data
bash
shopt -s extglob
以下と一緒に、またはでzsh
同じコンテンツを持つことができますsetopt kshglob
。shopt -s extglob ls a_*([a-z])_data
有効に
zsh
なるとregexpと同じextendedglob
です。#
*
setopt extendedglob ls a_[a-z]#_data
最新バージョンでは、
ksh93
globで正規表現を使用することもできます。これと共に拡大する一般的な表現:ls ~(E:a_[a-z]*_data)
[a-z]
現在のロケールによって他のコンテンツが一致します。通常、ロケールではa
最大26個のz
アクセントを持たないラテン文字のみが一致しますC
。他のロケールでは一般的にもっと一致しますが、必ずしも意味があるわけではありません。そのロケールの文字を一致させるには、を選択できます[[:alpha:]]
。