2015-03-24 3 views
0
echo $list | egrep '^a[^aeiou][0-9]' 

Что я должен делать с регулярным выражением, чтобы соответствовать следующим требованиям:Bash регулярного выражения, несколько критериев

Начать с «а», второй символ не может быть гласными, и должны быть хотя бы одним номером в имени файла.

Моя проблема, очевидно, делает число вещей правильным.

+2

Это упражнение хорошо работать для себя. Вы должны продолжать пытаться. Попробуйте задать себе этот вопрос: видя, что регулярное выражение, которое вы написали, не работает, что это такое? Можете ли вы объяснить это точными словами, что делает это регулярное выражение? –

+2

Другой способ атаковать проблему - разбить ее на куски. Попробуйте только третью часть: можете ли вы написать регулярное выражение, которое проверяет, содержит ли строка хотя бы одно число? Игнорируйте первые два критерия, просто обработайте третий. –

+0

«Моя проблема, очевидно, делает правильный номер». очевидно, не: 'a9' придерживается правил, но не соответствует. –

ответ

2

Ну я ее решил, но я не думаю, что это самый оптимальный вариант: 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 
0
echo "$list" | egrep '^a[^aeiou]\(.*[0-9].*\)?' 

В основном вы были почти там, недостающая часть должна была соответствовать другим персонажам вокруг номера, который вы хотите сопоставить.

+3

Это не может соответствовать «a1» –

+0

Это правда, если это требование, вы можете сделать echo $ list | egrep '^ a [^ aeiou] \ (. * [0-9]. * \)?' – SGD

1

С Вашего названия вопроса упоминает Баш регулярные выражения, вот как сделать это с помощью тех, вместо grep:

while IFS= read -r name; do 
    [[ "$name" =~ ^a([0-9]|[^aeiou].*[0-9]) ]] && printf "%s\n" "$name"; 
done <<< "$list" 
Смежные вопросы