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

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

テーブル名に整数が含まれていることを確認するシェルスクリプトに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演算子の右側でも使用できます== [[...]]

答え2

おそらく最も単純な正規表現は次のとおりです。

if [[ "$file" =~ _[0-9]+$ ]]
then
    echo OK $file
fi

答え3

これを行う方法はいくつかあります。以下は伝統的な正規表現のBashバージョンです(または少なくともBashが持っているものに最も近いもの):

pattern='^tablename_[[:digit:]]+$'
if [[ $filename =~ $pattern ]]; then
    echo "Filename $filename is valid"
fi

いくつかの注意:

  • 最も単純な正規表現を除くすべての場合は、ここで使用するように変数を使用することをお勧めしますpattern。内部式に単語の区切りやパス名の拡張が適用されない場合でも、[[ ]]チルダ、変数、および算術の拡張とプロセスとコマンドの置換があります。インライン正規表現を使用すると、不正確または予期しない結果が得られます。
  • POSIX文字クラスを使用していますが、[:digit:]それでも0-9大丈夫です。ここの他の答えのほとんどは後者を使用すると考え、完全性のために前者を示す価値があります。

コメント:このトピックへのバリエーションが多すぎるという事実(このスレッドのみ)は、sh一部の人が/ ...が好きではない理由の1つであり、bash...私が好きな理由の1つです。:)

答え4

これにはregexオプションを使用することをお勧めしますが、数字のみを含む通常のglobも使用できます。たとえば、次の操作を実行できます。

for file in tablename_[0-9]*; do
    [ -f "$file" ] || continue
    printf "%s\n" "$file"
done

で正規表現演算子を使用すると、bash次のことができます。

for file in tablename_*; do
    if [[ $file =~ _([[:digit:]]+)$ ]]; then
        printf "%s\n" "$file"
    fi
done

関連情報