Shell 如何在unix脚本中检查特定字符串之间的字符串?
字符串: 检查:Shell 如何在unix脚本中检查特定字符串之间的字符串?,shell,unix,Shell,Unix,字符串: 检查: name@gmail.com 我的代码 @ .com 我的问题 if [[ $word =~ "@" ]] then if [[ $word =~ ".com" || $word =~ ".ca" ]] 上面的例子通过了,这不是我想要的。如何检查“@”和“.com”之间的字符(1个或更多)?您可以使用非常基本的正则表达式: name@.com 它查找的字符串与以下内容完全相同: [[ $var =~ ^[a-z]+@[a-z]+\.[a-z]+$ ]]
name@gmail.com
我的代码
@
.com
我的问题
if [[ $word =~ "@" ]]
then
if [[ $word =~ ".com" || $word =~ ".ca" ]]
上面的例子通过了,这不是我想要的。如何检查“@”和“.com”之间的字符(1个或更多)?您可以使用非常基本的正则表达式:
name@.com
它查找的字符串与以下内容完全相同:
[[ $var =~ ^[a-z]+@[a-z]+\.[a-z]+$ ]]
它可以变得复杂到你想要的程度,例如,参见
见效
为什么不使用其他工具,如perl:
$ var="a@b.com"
$ [[ $var =~ ^[a-z]+@[a-z]+\.[a-z]+$ ]] && echo "kind of valid email"
kind of valid email
$ var="a@.com"
$ [[ $var =~ ^[a-z]+@[a-z]+\.[a-z]+$ ]] && echo "kind of valid email"
$
全局模式将是:
[$word==?*@?*.@(com|ca)]
?
匹配任何单个字符,*
匹配零个或多个字符
@(p1 | p2 | p3 |…)
是与给定模式之一匹配的。这需要:shopt-s extglob
测试:
> echo "x@gmail.com" | perl -lne 'print $1 if(/@(.*?)\.com/)'
gmail
对不起,你能进一步解释吗?我不明白^[a-z]@[a-z].[a-z]在做什么。括号外的&&正在做什么请使用
\.
匹配文字
@Dan当然,只要用正确的解释更新我的答案。[[condition]]&&echo“hello”
在[[]]
为真的情况下执行echo
。因此,通过这种方式,您可以检查是否正在输入if
条件。
> echo "x@gmail.com" | perl -lne 'print $1 if(/@(.*?)\.com/)'
gmail
$ for word in @.com @a.ca a@.com a@b.ca a@b.org; do
echo -ne "$word\t"
[[ $word == ?*@?*.@(com|ca) ]] && echo matches || echo does not match
done
@.com does not match
@a.ca does not match
a@.com does not match
a@b.ca matches
a@b.org does not match