Bash正则表达式,多个标准

时间:2015-03-24 18:09:52

标签: regex bash grep

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

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

  

以'a'开头,第二个字符不能是元音,文件名中至少应有一个数字。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

echo "$list" | egrep '^a[^aeiou]\(.*[0-9].*\)?'

基本上你几乎就在那里,缺少的部分是为了匹配你想要匹配的数字周围的其他角色。