正则表达式只匹配数字

时间:2014-02-09 11:46:56

标签: regex shell sed

我在理解bash shell中的正则表达式究竟是什么时遇到了问题。

我有字符串abcde 12345 67890testing。我想使用12345从此字符串中提取sed

但是,在给定字符串上使用sed -re 's/([0-9]+).*/\1/'会给我abcde 12345

或者,使用sed -re 's/([\d]+).*/\1/'实际上只会提取abcd

假设表达式[0-9][\d]仅捕获数字,我错了吗?我不知道如何捕获abcd但字符67890不是。另外,我想知道为什么在我的第一个查询中捕获空间?

此外,sed -re 's/^.*([0-9]+).*/\1/'给了我0。在这种情况下,我完全不明白正则表达式在做什么。我以为表达式^.*[0-9]+只会捕获一串只有数字的第一个实例?但是,它仅匹配最后的0。

总而言之,我想了解我对这些问题的看法。如何在正则表达式中使用[\ s]来隔离第一个数字串来解决问题。

3 个答案:

答案 0 :(得分:3)

sed -E 's/([0-9]+).*/\1/g'  <<< "$s" 

上面的命令意味着:找到一个数字序列,后跟一些东西,只用数字替换它。所以它匹配 12345 67890testing 并仅用 12345 替换它。

最后一个字符串将是 abcd 12345

如果你只想获得12345,你应该使用grep。

egrep -o '[0-9]+ ' <<< "$s"

或者使用sed,您可以使用:

sed -E 's/[a-zA-Z ]*([0-9]+).*/\1/g'  <<< "$s"

这将删除数字前面的字母

答案 1 :(得分:0)

您可以使用:

sed 's/^\([0-9]*\).*$/\1/g' <<< "$s"
12345

或者修改你的sed:

sed 's/\([0-9]\+\).*/\1/g' <<< "$s"
12345

你需要逃避+&amp; sed中的( and )没有扩展的正则表达式标记(-r OR -E)。

-r它将是:

sed -r 's/([0-9]+).*/\1/g' <<< "$s"
12345

UPDATE:您实际上并不需要任何外部实用程序,因为您可以使用其正则表达式功能在BASH中执行此操作:

[[ "$s*" =~ ^([0-9]+) ]] && echo "${BASH_REMATCH[1]}"
12345

答案 2 :(得分:0)

因为其他人已经用sed,grep提供了解决方案,这里是awk代码:

echo "abcde 12345 67890testing"|awk '{for (i=1;i<=NF;i++) if ($i~/^[0-9]+$/) print $i}'