カンマ区切りの数字と一致するグローバルパターン

カンマ区切りの数字と一致するグローバルパターン

カンマで区切られた数字と一致するグローバルパターンを作成したいと思います。パターンはどんな姿なのでしょうか?

ここにいくつかの例があります。

5
5,8,13

次に始めましたが、一致するものを取得できないため、いくつかの問題があります。

var="8,13,21"
echo "var: $var"
if [[ "$var" == ^*([[:digit:]])+(,+[[:digit:]])$ ]]; then
  echo "match"
fi

ベストアンサー1

bashのマニュアルは[[ expression ]]構文を説明します。

==AND演算子を使用すると、!=演算子の右側の文字列はパターンとして扱われ、シェルオプションが有効になっている extglob かのように、パターンの一致で説明されている規則に従って一致します。

ここで、シェルオプションはextglobksh スタイル拡張グローブを表します。

  ?(pattern-list)
         Matches zero or one occurrence of the given patterns
  *(pattern-list)
         Matches zero or more occurrences of the given patterns
  +(pattern-list)
         Matches one or more occurrences of the given patterns
  @(pattern-list)
         Matches one of the given patterns
  !(pattern-list)
         Matches anything except one of the given patterns

私が疑うのは、+[[:digit:]]1つ以上の数字を一致させることです+([[:digit:]])。したがって、カンマの後に1つ以上の数字が続き、すべて0回以上でなけれ*(,+([[:digit:]])ばなりません。

+([[:digit:]])*(,+([[:digit:]]))

カンマで区切られたリストを形成するには、1つ以上の数字と0つ以上のカンマで区切られた数字が続く一致を見つけます。

^glob式はアンカーを使用しないことに注意してください$。これは常に完全な行です。部分一致が必要な場合は、*式をワイルドカードで囲む必要があります。


1 これはbash 4.1以降の新機能です。以前のバージョンでは、shopt -s extglobこれらの拡張グローバル演算子を内部および外部で明示的に使用できるようにする必要がありました[[...]]

おすすめ記事