sed提取数字

sed提取数字,sed,extract,digits,Sed,Extract,Digits,我尝试使用sed提取数字: echo hgdfjg678gfdg kjg45nn | sed 's/.*\([0-9]\+\).*/\1/g' 但结果是: 5. 如何提取:678和45? 提前谢谢 问题在于,*中的将匹配数字和非数字,并且它将尽可能长时间地保持匹配——也就是说,只要有一个数字未使用,就可以匹配[0-9] 不提取数字,只需删除非数字: echo hgdfjg678gfdg kjg45nn | sed 's/[^0-9]//g' 甚至 echo hgdfjg678gfdg kjg

我尝试使用sed提取数字:

echo hgdfjg678gfdg kjg45nn | sed 's/.*\([0-9]\+\).*/\1/g'
但结果是: 5. 如何提取:678和45?
提前谢谢

问题在于,
*
中的
将匹配数字和非数字,并且它将尽可能长时间地保持匹配——也就是说,只要有一个数字未使用,就可以匹配
[0-9]

不提取数字,只需删除非数字:

echo hgdfjg678gfdg kjg45nn | sed 's/[^0-9]//g'
甚至

echo hgdfjg678gfdg kjg45nn | tr -d -c 0-9

您可以将grep与选项-o一起使用:

$ echo hgdfjg678gfdg kjg45nn | grep -E -o "[0-9]+"
678
45

或使用
tr

$ echo hgdfjg678gfdg kjg45nn | tr -d [a-z]
678 45

sed
中的
*
是贪婪的。AFAIK中没有
非贪婪
选项。
(在这种情况下,非贪婪匹配必须使用
[^0-9]*
。但这只起作用一次,因此您将只获得
678
,而不使用
45

如果必须只使用
sed
,则不容易获得结果。
我建议使用gnu的
grep

$ echo hgdfjg678gfdg kjg45nn | grep -oP '\d+'
678
45
如果您真的想坚持使用
sed
,这将是许多可能的答案之一

$ echo hgdfjg678gfdg kjg45nn | \
sed -e 's/\([0-9^]\)\([^0-9]\)/\1\n\2/g' | \
sed -n 's/[^0-9]*\([0-9]\+\).*/\1/p’
678
45

在sed中,可能希望用一个空格替换非数字,这样就可以保留原始的数字分组。关于sed的文章很棒!您还可以使用
tr-d[:alpha:][/code>来处理大写字母。