Ну я ее решил, но я не думаю, что это самый оптимальный вариант: echo $list | egrep '^a[^aeiou]' | egrep '[0-9]{1,}'
Обратите внимание, вы должны процитировать вашу переменную: echo "$list" | ...
Это прекрасный способ пойти об этом. Второе выражение может быть проще: все, что вам нужно, чтобы соответствовать это одна цифра, так что вы можете оставить {1,}
Еще одна пара возможностей:
list="foo
alpha
a9
aa0
alpha1"
grep '[0-9]' <<< "$list" | grep '^a[^aeiou]' # same as yours
grep -E '^a([0-9]|[^aeiou].*[0-9])' <<< "$list"
grep -P '^a(?=.*\d)[^aeiou]' <<< "$list"
while read line; do
[[ $line =~ ^a([0-9]|[^aeiou].*[0-9]) ]] && echo "$line"
done <<< "$list"
Все, выход
a9
alpha1
Это упражнение хорошо работать для себя. Вы должны продолжать пытаться. Попробуйте задать себе этот вопрос: видя, что регулярное выражение, которое вы написали, не работает, что это такое? Можете ли вы объяснить это точными словами, что делает это регулярное выражение? –
Другой способ атаковать проблему - разбить ее на куски. Попробуйте только третью часть: можете ли вы написать регулярное выражение, которое проверяет, содержит ли строка хотя бы одно число? Игнорируйте первые два критерия, просто обработайте третий. –
«Моя проблема, очевидно, делает правильный номер». очевидно, не: 'a9' придерживается правил, но не соответствует. –