valid
名前があるときに次の正規表現が印刷されるのはなぜですかhdpworker01
?
name=hdpworker01
[[ $name =~ worker[[:digit:]] ]] && echo valid
私がやろうとしているのは、valid
名前が一致した場合にのみ印刷することですworker[0-999]
。
予想結果の例:
- のため
name=worker01
:valid
- 対象
name=hdpworker01
:出力なし
答え1
デフォルトでは、正規表現は文字列の先頭または末尾に固定されません。これは、たとえばファイル名のグロービングパターンとは異なります。これは、式が与えられた文字列のどこにでも一致できることを意味します。
式を文字列の先頭に固定するには、次のようにします。
^worker[[:digit:]]
文字列の末尾にさらに固定して1〜3桁の数字を許可するには、次のようにします。
^worker[[:digit:]]{1,3}$
一致したいがworker10
一致しないworker01
(worker003
ゼロパディングのない数字)、次を使用します。
^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"