web-dev-qa-db-ja.com

bash +正規表現で名前を確認する

名前がhdpworker01の場合、次の正規表現がvalidを出力するのはなぜですか?

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

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

期待される結果の例:

  • name=worker01の場合:valid
  • name=hdpworker01の場合:出力なし
4
yael

正規表現は、デフォルトでは文字列の最初または最後に固定されていません。これは、例えばとは異なります。ファイル名のグロブパターン。これは、式が指定された文字列のどこにでも一致する可能性があることを意味します。

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

^worker[[:digit:]]

さらに文字列の末尾に固定し、1〜3桁の数字を使用できるようにするには、次を使用します。

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

一致させたい場合はworker10 だがしかし worker01またはworker003(ゼロで埋められた数字はありません)、使用

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

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

^worker[[:digit:]]$

名前がhdpworker01であるのに、次の正規表現が有効である理由

どうして?正規表現はアンカーではないため、つまり、一致するはずの文字列の開始(または終了)を定義しません。一致する文字列のいずれかの部分がworkerの場合、正規表現workerが一致します。 hdpworkeranythingおよびworkerと他の多くのバリエーションに一致します。 workerで始まる文字列を照合するには、次のように正規表現に^を含めます。

^worker

Wordワーカーの後の3桁(最大)を一致させたい場合は、次を使用できます。

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

ただし、括弧で数字を取得し、変数内に正規表現を配置することをお勧めします(変数を使用することが現在のベストプラクティスです)。

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

$は、文字列がその時点で終了する必要があることを意味します。
試合は次のようになります:

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

私がやろうとしているのは、名前がworker [0-999]の場合にのみ有効な印刷を行うことです。

そして、それは数n範囲をチェックすることを可能にします:

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