bash +正規表現による名前解決

bash +正規表現による名前解決

valid名前があるときに次の正規表現が印刷されるのはなぜですかhdpworker01

name=hdpworker01
[[ $name =~ worker[[:digit:]] ]] && echo valid

私がやろうとしているのは、valid名前が一致した場合にのみ印刷することですworker[0-999]

予想結果の例:

  • のためname=worker01valid
  • 対象name=hdpworker01:出力なし

答え1

デフォルトでは、正規表現は文字列の先頭または末尾に固定されません。これは、たとえばファイル名のグロービングパターンとは異なります。これは、式が与えられた文字列のどこにでも一致できることを意味します。

式を文字列の先頭に固定するには、次のようにします。

^worker[[:digit:]]

文字列の末尾にさらに固定して1〜3桁の数字を許可するには、次のようにします。

^worker[[:digit:]]{1,3}$

一致したいがworker10一致しないworker01worker003ゼロパディングのない数字)、次を使用します。

^worker([0-9]|[1-9][0-9]{1,2})$

答え2

両側に正規表現を固定します。

^worker[[:digit:]]$

答え3

名前がhdpworker01の間に以下の正規表現印刷が機能するのはなぜですか?

なぜ?正規表現ではないので固定つまり、一致する必要がある文字列の先頭(または終わり)を定義しません。worker一致する文字列の一部がある場合、正規表現は一致しますworker。それは他の多くのバリエーションhdpworkeranythingとも一致します。worker次の文字列を一致させるには、正規表現workerにincludeを使用します^。たとえば、次のようになります。

^worker

Workerという単語の後に最大3桁の数字を一致させるには、次のようにします。

^worker[0-9]{0,3}$

ただし、括弧内の数字をキャプチャし、正規表現を変数に配置するのが賢明です(変数を使用することは現在のベストプラクティスです)。

re='^worker([0-9]{0,3})$'

これは$、文字列がその点で終わらなければならないことを意味します。
競争は次のとおりです。

[[ $str =~ $re ]] && n=$((10#${BASH_REMATCH[1]}+0)) || n=-1

私がやろうとしているのは、名前がワーカー[0-999]の場合にのみ印刷することです。動作します。

これにより、n数値の範囲を確認できます。

(( 0 <= n && n <= 999 )) && echo "valid with n=$n"

関連情報