简单的Bash和RegEx问题
我无法在Bash4.1中使用正则表达式获得正确匹配的模式。我读过一些关于引号和非引号的区别的信息,但我认为这不是我的问题 我的目标是检查并确保脚本提供了一个有效的ID。在本例中,有效的ID是一个9位数的字符串。据我所知,它的正则表达式是\d{9}。鉴于以下是我要检查的代码片段:简单的Bash和RegEx问题,regex,bash,bash4,Regex,Bash,Bash4,我无法在Bash4.1中使用正则表达式获得正确匹配的模式。我读过一些关于引号和非引号的区别的信息,但我认为这不是我的问题 我的目标是检查并确保脚本提供了一个有效的ID。在本例中,有效的ID是一个9位数的字符串。据我所知,它的正则表达式是\d{9}。鉴于以下是我要检查的代码片段: id=$1 if [[ $id =~ \d{9} ]]; then echo "This is a vaild ID" else echo "This is not a vaild ID
id=$1
if [[ $id =~ \d{9} ]]; then
echo "This is a vaild ID"
else
echo "This is not a vaild ID"
fi
然后使用以下命令调用脚本:
./script 987654321
很明显我错过了什么 试试这个:
if [[ $id =~ [0-9]{9} ]]; then
看起来bash没有将\d
识别为[0-9]
不支持\d
的
根据ERE的语法(词汇约定),转义字符的形式为\SPEC\u CHAR
<代码>规格字符可以是以下任意一种:
^ . [ $ ( ) |
* + ? { \
问题是\d在被解释之前被转换为d。尝试双重逃跑
\d{9} => d{9}
\\d{9} => \d{9}
或者,你可以把它放在引号里
if [[ $id =~ "\d{9}" ]]
正如其他人已经回答的那样,您应该使用
[0-9]{9}
,因为不支持\d
。但另一个重要的部分是,你必须使用锚强>
^[0-9]{9}$
^
将正则表达式锚定到字符串的开头,$
将其锚定到结尾。如果不使用它们,正则表达式将匹配序列中包含9位数字的每个字符串,如“abc123456789”、“ASDF1234567889ZUI”或“123456789FOOBAR”
这将起作用:如果[$id=~[:digit:]{9}]]-大卫·W·11小时前
@大卫:我在bash上试过,但似乎不起作用10小时前的Vivin Paliath
我刚刚编写了一个测试程序:
#! /bin/bash
for id in 123456789 12345689 1234567890 987654321
do
if [[ $id =~ ^[[:digit:]]{9}$ ]]
then
echo "$id is 9 digits long"
else
echo "$id is bad"
fi
done
我得到了以下结果:
DaveBook:~ david$ ./test.sh
123456789 is 9 digits long
12345689 is bad
1234567890 is bad
987654321 is 9 digits long
DaveBook:~ david$
我在Mac OS X上使用BASH 3.2.48,在Cygwin上使用BASH 4.1.10(4)(哇,Mac版本是那旧的?)。我还没有在Linux机器上测试过这个
你用的是什么版本?您是否在:digit:
周围将方括号加倍?它必须是[[:digit:][]
,而不是[:digit:][/code>
我还意识到我需要^
和$
锚定在那里,因为您不想匹配foo123456789bar
或12345678901346790
。这是你的问题吗
问题是[[:digit:][]
应该已经起作用了。我在许多bashshell脚本中使用过它,认为它相当通用。但是,如果您的bashshell不起作用,我将不得不停止使用它。您应该编辑您的问题,包括您认为它不起作用的原因。你要去别的地方吗?或者您是否遇到语法错误。祝你好运。Bash(v3及更高版本)中的Regexp不支持\d
,你可以使用[0-9]
或[:digit:
posix字符类。完全可移植的方法是使用全局模式,即[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]中的case$id;*)在痛苦中死去;;esac
我不知道我之前抽的是什么,但我现在刚试过,效果不错。我可以发誓,当我最后一次尝试它时,它不起作用,因为这是我第一次尝试的东西之一。这就是我想要的。谢谢。您是否有一篇参考文章来查找/d&[:digit:]等项之间的等式,或者手册页是最好的资源?实际上,最好的来源是Perl文档。毕竟,所有扩展正则表达式的内容最初都来自Perl。看一看和角色类有关的部分。非常感谢!不过,您如何指定一个最多9位数的数字?@David我已经测试过了,现在可以使用了。我不知道为什么我第一次尝试它时它不起作用。为什么你必须把[[和]]放在:数字:?