Bash正则表达式:检查字符串的第一个字符是否为数字

6
我正在编写一个使用traceroute的脚本。我正在遍历traceroute的每一行,然后遍历每个单词(由空格分隔)。但是,有时traceroute返回一个*字符,这会导致输出文件名时出现问题。
我一直在尝试用正则表达式解决这个问题,目前我得到了以下解决方案:
if [[ $item =~ ^\d ]];

Item是trace route的一部分。

对于trace route中的每个item,我只想检查第一个字符是否为数字,然后相应地继续进行。


你需要使用 if [[ $item =~ ^[0-9] ]];\d 不被支持。 - Wiktor Stribiżew
1
^[[:digit:]] 也可以工作。 - rock321987
https://dev59.com/qZTfa4cB1Zd3GeqPXOWp#35894180 - Wiktor Stribiżew
2个回答

16

\d不支持POSIX 正则表达式(由 Bash 使用)。您需要将其替换为[0-9],如下所示:

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

看看这个StackOverflow答案

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

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

应该是 ^[[:digit:]] - [:digit:] 是一个字符类,需要放在方括号表达式中。 - Tom Fenech
@TomFenech 抱歉,那是我打字太快了!已经更正了,谢谢! - Kaspar Lee

2
不需要使用正则表达式,只需使用通配符即可:
[[ $item == [0-9]* ]] && echo "it starts with a digit"

你还可以使用:

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

顺便问一下,你知道在Bash中哪个更有效率:通配符还是正则表达式? - Wiktor Stribiżew
一般来说,正则表达式比glob模式慢,但我自己没有进行过严格的基准测试。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接