我无法理解我在 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/