
変数「X」が次のパターンにあることを確認したいと思います[a-zA-Z0-9]+:[0-9]+:[0-9]+
。次のコマンドで確認してください。if [[ "${X}" =~ [a-zA-Z0-9]+:[0-9]+:[0-9]+ ]]
ここで、パターンを複数に挿入するオプションを追加したいと思います。この場合,
。私は同様のことができると思いました[a-zA-Z0-9]+:[0-9]+:[0-9]+[,[a-zA-Z0-9]+:[0-9]+:[0-9]+]*
。私の質問は短くすることができますか?
答え1
^[a-zA-Z0-9]+:[0-9]+:[0-9]+(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)*$
セクションに角かっこの代わりに括弧を使用し、パターンを文字列の先頭と最後に固定する必要があります(,...)*
(そうでない場合は、文字列の一部と一致するのに十分です)。
1つのオプションは、正規表現を維持しながら繰り返し部分を変数に格納することです。
p='[a-zA-Z0-9]+:[0-9]+:[0-9]+'
s='foo:12:34,bar:56:78'
[[ $s =~ ^$p(,$p)*$ ]] && echo yes
または、前にカンマを追加してください。値、REを次に変更してください(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+
。
q='^(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+$'
[[ ,$s =~ $q ]] && echo yes
ただし、スクリプトのリストの値を処理する場合は、すぐにそれを複数の部分に分割する必要があるため、各部分を個別に分割してテストすることから始めることができます。
s='adsf,bar:56:78'
p='^[a-zA-Z0-9]+:[0-9]+:[0-9]+$'
IFS=, read -a a <<< "$s"
for x in "${a[@]}"; do
if [[ $x =~ $p ]]; then
echo "$x is ok";
else
echo "$x is not ok";
fi
done