正規表現は、文字ではなく下線の後に数字があることを確認します。

正規表現は、文字ではなく下線の後に数字があることを確認します。

テーブル名に整数が含まれていることを確認するシェルスクリプトにifループがあります。これが私が指定した条件です。

if [[ "$able_name" == *[0-9]* ]] 

通常、テーブル名は次のとおりです。

tablename_000 

または

tablename_001 

ただし、名前が正規表現と一致するため、このループに入る新しいファイルがありますtable_V2。これをどのように避けることができますか?ifアンダースコアの後に整数があり、他の文字がない場合にのみループに入る必要があります。

ベストアンサー1

標準sh構文を使用してください。

case ${table_name##*_} in
  ("$table_name" | "" | *[!0-9]*) echo >&2 incorrect;;
  (*) echo correct;;
esac

つまり、チェックは$table_name一番右にあるそれ自体(何も意味しません)でも空の_文字列でも、数字以外の文字を含むすべてを削除します。$table_name$table_name_

文字列を正規表現と一致させる標準コマンドexprにはいくつかの問題があり、コードは明確ではありません。

if expr " $table_name" : '.*_[0-9]\{1,\}$' > /dev/null; then
  echo Correct
else
  echo >&2 Incorrect
fi

先行スペースは、$table_namelike+またはの値に問題が発生しないようにするためのものです--help。正規表現は暗黙的に始まり(is .*)に固定されますが、終わり(is)には固定されず、$結果(ここでは0または1)が終了状態に反映されることに加えてstdoutに出力されるため、/にリダイレクトされます。開発/ボード。

組み込み合計[などの一部の実装には演算子があります(EREを使用しますが、次のようにPCREに変更できます)。[zshyash=~zsh

if [ "$table_name" '=~' '_[0-9]+$' ]; then
   echo Correct
else
   echo >&2 Incorrect
fi

bash、参照の構文と動作は実装ごとに異なりますが、そのzsh中にksh93演算子演算子があります。=~[[...]]変数を使用する方が良い@BLayerに見られるように

zsh -o extendedgloband kshbash -O extglobまたはzsh -o kshglobglobサブセットのサポートksh)は構文は異なりますが、機能的に正規表現と同じglob演算子があります。

翻訳RE - > ksh-glob/zsh-glob:

  • [0-9]-> [0-9]/[0-9]
  • x+-> +(x)/x##
  • $または^- >暗黙的/暗黙的
  • .->?
  • .*-> *(または*(?))/ *(または?#

したがってksh(またはbash -O extglobまたはzsh -o kshglob)では:

case $table_name in
  (*_+([0-9]) echo correct;;
  (*) echo >&2 incorrect;;
esac

存在するzsh -o extendedglob

case $table_name in
  (*_[0-9]##) echo correct;;
  (*) echo >&2 incorrect;;
esac

zshからの10進数を<x-y>一致させる拡張glob演算子もあるので、それを書くこともできます。xy(*_<->) echo correct

=これらのシェルでは、これらのglobはaka演算子の右側でも使用できます== [[...]]

おすすめ記事