2016-04-07 104 views
0

我在写一个使用跟踪路由的脚本。我遍历跟踪路由的每一行,然后遍历每个单词(用空格分隔)。但是,有时跟踪路由会返回*字符,这会在回显(输出文件名)时导致问题。Bash正则表达式来检查字符串的第一个字符是否是一个数字

我一直在摆弄用正则表达式,到目前为止我已经想出了这一点:

if [[ $item =~ ^\d ]]; 

项目是跟踪路由的一部分。

对于跟踪路由行中的每个项目,我只想检查第一个字符是否等于数字,然后相应地继续。

+0

您需要使用if [[$ item =〜^ [0-9]]];不支持','\ d'。 –

+1

'^ [[:digit:]]'也可以工作 – rock321987

+0

http://stackoverflow.com/questions/35894043/how-do-i-validate-that-a-version-number-is-valid-using-a -regexp-in-bash/35894180#35894180 –

回答

3

\d不支持POSIX Regular Expressions(由Bash使用)。您需要[0-9]来取代它,像这样:

if [[ $item =~ ^[0-9] ]]; 

退房this StackOverflow answer

也使用[:digit:],使其更易于阅读:

if [[ $item =~ ^[[:digit:]] ]]; 
+0

应该是'^ [[:digit:]]' - '[:digit:]'是一个需要进入括号表达式的字符类。 –

+0

@TomFenech对不起,这是我快速打字!更正了,谢谢! – Druzion

1

没有必要使用正则表达式只是glob的是足够:

[[ $item == [0-9]* ]] && echo "it starts with a digit" 

您也可以使用:

[[ $item == [[:digit:]]* ]] 
+0

顺便说一句,你知道什么是更有效的Bash:球或正则表达式? –

+0

一般来说,正则表达式被认为比glob模式慢,但我自己并没有做过任何严肃的基准测试。 – anubhava

相关问题