Bash 正则表达式,多个条件

Bash regular expression, multiple criteria

echo $list | egrep '^a[^aeiou][0-9]'

我应该如何处理正则表达式以满足以下要求:

Start with an 'a', second char can't be a vowel, and there should be at least one number in the name of the file.

我的问题显然是正确处理数字。

Well i solved it but i dont think it is the most optimal way: 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
echo "$list" | egrep '^a[^aeiou]\(.*[0-9].*\)?'

基本上你已经差不多了,缺少的部分是匹配你想要匹配的数字周围的其他字符。

由于您的问题标题提到了 bash 正则表达式,下面是使用正则表达式而不是 grep 的方法:

while IFS= read -r name; do 
    [[ "$name" =~ ^a([0-9]|[^aeiou].*[0-9]) ]] && printf "%s\n" "$name"; 
done <<< "$list"