Regex Bash正则表达式,多个条件
我应该如何处理正则表达式以满足以下要求: 以“a”开头,第二个字符不能是元音,文件名中至少应有一个数字 很明显,我的问题是把数字做对 我解决了这个问题,但我认为这不是最好的方法:Regex Bash正则表达式,多个条件,regex,bash,grep,Regex,Bash,Grep,我应该如何处理正则表达式以满足以下要求: 以“a”开头,第二个字符不能是元音,文件名中至少应有一个数字 很明显,我的问题是把数字做对 我解决了这个问题,但我认为这不是最好的方法:echo$list | egrep'^a[^aeiou]'.[0-9]{1,}' 注意,您应该引用变量:echo“$list”|…… 这是一个很好的方法。第二个表达式可能更简单:只需匹配一个位数,就可以删除{1,} 还有两种可能性: echo $list | egrep '^a[^aeiou][0-9]' 我解决了这个
echo$list | egrep'^a[^aeiou]'.[0-9]{1,}'
注意,您应该引用变量:echo“$list”|……
这是一个很好的方法。第二个表达式可能更简单:只需匹配一个位数,就可以删除{1,}
还有两种可能性:
echo $list | egrep '^a[^aeiou][0-9]'
我解决了这个问题,但我认为这不是最好的方法:echo$list | egrep'^a[^aeiou]'.[0-9]{1,}'
注意,您应该引用变量:echo“$list”|……
这是一个很好的方法。第二个表达式可能更简单:只需匹配一个位数,就可以删除{1,}
还有两种可能性:
echo $list | egrep '^a[^aeiou][0-9]'
基本上你就快到了,缺少的部分是匹配你想要匹配的数字周围的其他字符
基本上,您就快到了,缺少的部分是匹配您想要匹配的数字周围的其他字符。由于您的问题标题提到了bash正则表达式,下面介绍如何使用它们而不是
grep
:
echo "$list" | egrep '^a[^aeiou]\(.*[0-9].*\)?'
而IFS=read-r name;做
[[“$name”=~^a([0-9]|[^aeiou].[0-9])]&&printf“%s\n”“$name”;
完成由于您的问题标题提到bash正则表达式,下面介绍如何使用这些正则表达式而不是grep
:
echo "$list" | egrep '^a[^aeiou]\(.*[0-9].*\)?'
而IFS=read-r name;做
[[“$name”=~^a([0-9]|[^aeiou].[0-9])]&&printf“%s\n”“$name”;
这样做对你自己来说是一个很好的锻炼。你应该继续努力。试着问自己这样一个问题:既然你写的正则表达式不起作用,那么它与什么匹配呢?你能用精确的语言解释一下正则表达式的作用吗?解决这个问题的另一种方法是把它分解成碎片。试一试第三件事:你能写一个正则表达式来检查一个字符串是否至少包含一个数字吗?忽略前两个条件,只处理第三个条件。“我的问题显然是把数字处理对了。”显然不是:a9
遵守规则,但不匹配。你想这样echo$list | egrep[:alpha:[0-9]
是指bash正则表达式还是grepgrep
不是bash,bash有自己的正则表达式引擎。这是一个很好的练习。你应该继续努力。试着问自己这样一个问题:既然你写的正则表达式不起作用,那么它与什么匹配呢?你能用精确的语言解释一下正则表达式的作用吗?解决这个问题的另一种方法是把它分解成碎片。试一试第三件事:你能写一个正则表达式来检查一个字符串是否至少包含一个数字吗?忽略前两个条件,只处理第三个条件。“我的问题显然是把数字处理对了。”显然不是:a9
遵守规则,但不匹配。你想这样echo$list | egrep[:alpha:[0-9]
是指bash正则表达式还是grepgrep
不是bash,bash有自己的正则表达式引擎。这与“a1”不匹配是真的,如果这是一个要求,你可以做echo$list | egrep'^a[^aeiou](.[0-9].*)这与“a1”不匹配是真的,如果这是一个要求,你可以做echo$list | egrep'^a[^aeiou](.[0-9].*)
while IFS= read -r name; do
[[ "$name" =~ ^a([0-9]|[^aeiou].*[0-9]) ]] && printf "%s\n" "$name";
done <<< "$list"