正则表达式只匹配数字

标签 regex shell sed

我无法理解我在 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] 来隔离第一串数字的情况下解决问题。

最佳答案

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"

这将删除数字之前的字母

关于正则表达式只匹配数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21658671/

相关文章:

linux - $!在 shell 脚本中意味着什么

node.js - 在不使用额外的 NPM 包的情况下检查 package.json 是否在 shell 脚本中具有特定名称的脚本

bash - 如何在 shell 中解码 URL 编码的字符串?

regex - 在 sed 中插入换行符 (Mac OS X)

c# - 使用 RegEx 从字符串中删除编码的 HTML

ruby-on-rails - Rails, Controller 中的字母数字验证

java - 检查 JDBC String/VARCHAR 比较中的转义 %?

java - 自定义十进制的正则表达式

Linux (ubuntu) - sed,仅删除文件中的模式匹配

linux - Linux 中的稳定排序