Если вы хотите получить только согласованный текст регулярного выражения, я бы использовал
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)
Предполагаю, что ваше регулярное выражение должно быть упрощенным примером того, что вы действительно делаете. ? не является полезным, и ваши кавычки соответствуют литеральной строке.