[az] アスタリスクが数字と一致するのはなぜですか?

[az] アスタリスクが数字と一致するのはなぜですか?

現在のパスには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

部品が[a-z]数値と一致しません。これは*シェルに対して混乱する可能性があります。ワイルドカードそして一般的な表現

grepさまざまな種類の正規表現を許可するツール(基本的なデフォルトで-Eは拡張の-P場合パール正規表現)

たとえば(逆-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

答え2

だから質問は:なぜa_[a-z]*_data一致するのですかa_clean_0db_data

これは次のように分割できます。4つ部分:

  • a_試合開始a_clean_0db_dataclean_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
    
  • bashshopt -s extglob以下と一緒に、またはでzsh同じコンテンツを持つことができますsetopt kshglob

    shopt -s extglob
    ls a_*([a-z])_data
    
  • 有効にzshなるとregexpと同じextendedglobです。#*

    setopt extendedglob
    ls a_[a-z]#_data
    
  • 最新バージョンでは、ksh93globで正規表現を使用することもできます。これと共に拡大する一般的な表現:

    ls ~(E:a_[a-z]*_data)
    

[a-z]現在のロケールによって他のコンテンツが一致します。通常、ロケールではa最大26個のzアクセントを持たないラテン文字のみが一致しますC。他のロケールでは一般的にもっと一致しますが、必ずしも意味があるわけではありません。そのロケールの文字を一致させるには、を選択できます[[:alpha:]]

関連情報