Если вы хотите получить только соответствующий текст регулярного выражения, я бы использовал
grep -o 'regex' file
В духе вашего кода я бы изменил его на
while read line; do
[[ $line =~ regex ]] || continue
# do somethinw with $line or $BASH_REMATCH, perhaps put it in an array.
done < file
Если вы хотите сопоставить несколько регулярных выражений в одной строке, вот способ.
while read line; do
# do somethinw with $line
done < <(grep -o 'regex' file)
Я предполагаю, что ваше регулярное выражение должно быть упрощенным примером того, что вы действительно делаете. ? не поможет, и ваши кавычки совпадают с литеральной строкой.