ファイル名が特定のパターンと一致することを確認したいと思います。

ファイル名が特定のパターンと一致することを確認したいと思います。

ファイル名が英数字([a-zA-Z0-9])で始まり、英数字と「.」、「-」、および「_」文字のみを含む特定のパターンと一致することを確認したいと思います。

fileNamePattern="^[a-zA-Z0-9]+[\.-_]*"
if [[ $i(file from input) == $fileNamePattern ]]
      then
         echo "success"
      else
         echo "fail"
fi

これが私が解決しようとした方法ですが、「[[」の後に予期しない演算子が表示されませんでした。助けてください。

答え1

拡張正規表現をワイルドカードパターンに変換する場合は、以下を含めずにcase ... esacinを使用してdash変数値が一致することを確認できますgrep

case $name in
    [a-zA-Z0-9]*[._-]*)
        echo success
        ;;
    *)
        echo failure
esac

このパターンは、一致する文字で始まり、ドット、アンダースコア、またはダッシュも含む値と一致します[a-zA-Z0-9](式が最後の文字セットを受け入れても確認したいと思います)。いいえ文字列に存在します)。._().-_の間の範囲を使用することはあまり意味がないので、ダッシュを角括弧式の末尾に移動しました。私もあなたを想定していますいいえリテラルバックスラッシュと一致させたいです。これを行うには、\\2番目の角かっこ式に追加します。

まあそうだ*大丈夫です。ただし、それ以外の英数字以外の文字と一致し続ける可能性があるため、目的の操作は実行されません。._-

テストの意味を変えて、次の名前をテストしてみましょう。失敗する:

case $name in
    *[![:alnum:]_.-]*)
        echo failure
        ;;
    *)
        echo success
esac

これで、値に存在すると予想されない文字を含む値が検出されます。価値があるかどうかを正しくテストしていません。スタートしかし、英数字で...

case $name in
    *[![:alnum:]_.-]*)
        echo 'failure (contains wrong characters)'
        ;;
    *)
        case $name in
            [[:alnum:]]*)
                echo success
                ;;
            *)
                echo 'failure (does not start with alnum)'
        esac
esac

これは最大2回のテストを実行します。まず、値に不要な文字が含まれていることを確認し、そうでない場合は正しい型の文字で始まるかどうかを確認します。

答え2

POSIXlyで文字列を正規表現に一致させるには、expr次のようにしますawk

bre_match_anchored_at_start() { expr "x$1" : "x$2" > /dev/null; }
ere_match() { awk 'BEGIN{exit(!(ARGV[1] ~ ARGV[2]))}' "$1" "$2"; }

その後、次のものを使用できます。

if bre_match_anchored_at_start "$string" '[a-zA-Z0-9][a-zA-Z0-9._-]*$'; then
  echo match
fi

または:

if ere_match "$string" '^[a-zA-Z0-9][a-zA-Z0-9._-]*$'; then
  echo match
fi

ただし、何もa-z一致するものは指定されておらず、C / POSIXロケール以外のほとんどのシステムでは多少ランダムです。代わりに、すべての英数字に一致する(POSIX、しかしすべての実装でサポートされているわけではありません)を使用できます(Cロケールでない場合は、おそらく英語の52文字と10進数の10文字がはるかに超えるでしょう)。これらのみを一致させるには、次のようにします。A-Z0-9[[:alnum:]]awk

if (export LC_ALL=C; ere_match "$string" '^[a-zA-Z0-9][a-zA-Z0-9._-]*$'); then
  echo match
fi

否定的なアプローチでは、標準シェル構成を使用して同じ結果を得ることもできます。

case $string in
  ("" | [!a-zA-Z0-9]* | *[!a-zA-Z0-9._-]*) ;;
  (*) echo match;;
esac

答え3

[[ "$filename" =~ pattern ]]利用できない場合は、次のものを使用できますgrep

if printf '%s' "$filename" | grep -qz 'pattern'; then
    echo "success"
else
    echo "fail"
fi

注、grep活用してください基本正規表現デフォルトとして。あなたの-E-Pgrep

関連情報