10

変数が正確に 2 つの数値であるかどうかを確認しようとしていますが、理解できないようです。

KornShell (ksh) で正規表現 (regex) を確認するにはどうすればよいですか?

私が試してみました:

if [[ $month =~ "[0-9]{2}" ]]
if [[ $month = _[0-9]{2}_ ]]

私はそれに関するドキュメントを見つけることができませんでした。

洞察はありますか?

4

5 に答える 5

9
case $month in
    [0-9][0-9]) echo "ok";;
    *) echo "no";;
esac

動作するはずです。

完全な正規表現検索が必要な場合は、次egrepのように使用できます。

if echo $month | egrep -q '^[0-9]{2}$'
then
    echo "ok"
else
    echo "no"
fi
于 2010-01-23T00:11:03.563 に答える
8

Ksh は、ksh88 以降、限定された拡張パターンをサポートしています。

special '(' pattern ')'

構文。

ksh88 では、「特殊」文字のプレフィックスによって、予想される一致の数が変わります。

'*' for zero or more matches
'+' at least one match
'@' for exactly one match
'?' for zero or one matches
'!' for negation

ksh93 では、これが拡張されました。

'{' min ',' max '}'

正確な範囲を表現するには:

for w in 1423 12 "" abc 23423 9 33 3  333
do
  [[ $w == {1,3}(\d) ]] && print $w has between 1 and three digits
  [[ $w == {2}(\d) ]] && print $w has exactly two digits
done

そして最後に、'~' を使用して perl のような乱雑さを実現できます。これにより、完全な正規表現を含むまったく新しいクラスの拡張機能が導入されます。

'~(E)(正規表現)'

その他の例は、Finnbarr P. Murphy のブログにあります。

于 2011-04-02T14:38:30.460 に答える
5

私の出身地では、これは数値の月を検証する可能性が高くなります。

if (( $month >= 1 && $month <= 12 ))

また

[[ $month =~ ^([1-9]|1[012])$ ]]

または、1 桁の月の先頭にゼロを含めるには、次のようにします。

[[ $month =~ ^(0[1-9]|1[012])$ ]]
于 2010-01-23T03:32:45.330 に答える
3

ksh は正規表現を使用しません。「シェルグロビングパターン」と呼ばれる、より単純ですが非常に便利な言語を使用します。重要なアイデアは次のとおりです。

  • クラスは、クラス内の任意の文字に類似[0-9]または[chly]一致します。
  • .特殊文字ではありません。のみ一致し.ます。
  • ?任意の 1 文字に一致します。
  • は、*任意の文字列に一致します。
  • 正規表現とは異なり、シェルのグロビング パターンは単語全体に一致する必要があるため、常に で始まり で^終わる正規表現であるかのように機能し$ます。

グロビング パターンは正規表現ほど強力ではありませんが、はるかに読みやすく、ファイル名と単純な単語を照合するのに非常に便利です。コンストラクトは私のcaseお気に入りのマッチングですが、他にもあります。

すでにAlokで指摘されているように、おそらく必要です

case $number in
  [0-9][0-9]) success ;;
  *) failure;;
esac

2 桁の数字と最初の 0 を一致させたくない場合もあるので、[1-9][0-9].

于 2010-01-23T10:37:15.440 に答える
0

これも試すことができます

$ month=100
$ [[ $month == {1,2}([0-9]) ]] && echo "ok" || echo "no"
no
$ [[ $month == [0-9][0-9] ]] && echo "ok" || echo "no"
no
$ month=10
$ [[ $month == {1,2}([0-9]) ]] && echo "ok" || echo "no"
ok
$ [[ $month == [0-9][0-9] ]] && echo "ok" || echo "no"
ok
于 2010-01-23T01:03:26.107 に答える