sed 提取数字
我尝试用 sed: 提取数字:
echo hgdfjg678gfdg kjg45nn | sed 's/.*\([0-9]\+\).*/\1/g'
但结果是: 5 如何提取:678和45? 提前致谢!
I try to extract digits with sed:
echo hgdfjg678gfdg kjg45nn | sed 's/.*\([0-9]\+\).*/\1/g'
but result is:
5
How to extract: 678 and 45?
Thanks in advance!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
问题是
.*
中的.
将匹配数字和非数字,并且它会尽可能长时间地匹配 - 即只要还有一位未使用的数字可以与[0-9]
匹配。不提取数字,只需删除非数字:
甚至
The problem is that the
.
in.*
will match digits as well as non-digits, and it keeps on matching as long as it can -- that is as long as there's one digit left unconsumed that can match the[0-9]
.Instead of extracting digits, just delete non-digits:
or even
您可以使用带选项 -o 的 grep 来执行此操作:
You may use grep with option -o for this:
或者使用
tr
:Or use
tr
:sed
中的.*
是贪婪的。并且没有non-greedy
选项 AFAIK。(在这种情况下,您必须使用
[^0-9]*
进行非贪婪匹配。但这有效仅一次,因此您将仅得到678
而没有45
。)如果必须仅使用
sed
,则不容易获得结果.我建议使用 gnu 的
grep
如果您确实想坚持使用
sed
,这将是许多可能的答案之一。.*
insed
is greedy. And there are nonon-greedy
option AFAIK.(You must use
[^0-9]*
in this case for non-greedy matching. But this works only once, so you will get only678
without45
.)If you must use only
sed
, it would not be easy to get the result.I recommend to use gnu’s
grep
If you really want to stick to
sed
, this would be one of many possible answers.