shell 仅匹配数字的正则表达式

qncylg1j  于 2022-11-16  发布在  Shell
关注(0)|答案(4)|浏览(360)

我在理解我的正则表达式在bash shell中到底在做什么时遇到了问题。
我有一个字符串abcde 12345 67890testing,我想用sed从这个字符串中提取12345
然而,在给定的字符串上使用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]来分离第一串数字的情况下解决这个问题。

jc3wubiy

jc3wubiy1#

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"

这将删除数字前的字母

yacmzcpb

yacmzcpb2#

您可以用途:

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

否则修改sed:

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

您需要在sed中转义+ & ( and ),而不使用扩展正则表达式标志(-r OR -E)。
使用-r,它将是:

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

**UPDATE:**您实际上不需要任何外部实用程序来完成此操作,因为您可以使用BASH本身的regex功能来完成此操作:

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

wrrgggsh3#

由于其他人已经提供了sed和grep的解决方案,下面是awk代码:

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

webghufk4#

使用剪切命令比较简单

echo "abcde 12345 67890testing" | cut -d' ' -f2

相关问题