我在理解我的正则表达式在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]来分离第一串数字的情况下解决这个问题。
4条答案
按热度按时间jc3wubiy1#
以上命令的意思是:找到一个数字序列,后面跟一个数字,然后只用数字替换它。因此,它匹配 12345 67890testing,并只用 12345 替换它。
最后一个字符串为 abcd 12345。
如果您只想得到12345,您应该使用grep。
或者,通过sed,您可以用途:
这将删除数字前的字母
yacmzcpb2#
您可以用途:
否则修改sed:
您需要在sed中转义
+
&( and )
,而不使用扩展正则表达式标志(-r OR -E
)。使用
-r
,它将是:**UPDATE:**您实际上不需要任何外部实用程序来完成此操作,因为您可以使用BASH本身的regex功能来完成此操作:
wrrgggsh3#
由于其他人已经提供了sed和grep的解决方案,下面是awk代码:
webghufk4#
使用剪切命令比较简单