sed提取数字
我尝试使用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
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>来处理大写字母。