Você deseja ^[a-zA-Z0-9]+:[0-9]+:[0-9]+(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)*$
, com parênteses em vez de colchetes na parte (,...)*
e com o padrão bloqueado para o início e o fim da sequência (caso contrário, é suficiente corresponder a uma parte da sequência).
Uma opção é deixar o regex assim, mas apenas armazenar a parte repetitiva em uma variável:
p='[a-zA-Z0-9]+:[0-9]+:[0-9]+'
s='foo:12:34,bar:56:78'
[[ $s =~ ^$p(,$p)*$ ]] && echo yes
Ou coloque uma vírgula principal no valor e altere o RE para (,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+
:
q='^(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+$'
[[ ,$s =~ $q ]] && echo yes
No entanto, se você for processar os valores na lista do script, precisará dividi-lo em partes, mais cedo ou mais tarde. Assim, basta dividir primeiro e testar cada parte separadamente:
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