我尝试用sed提取数字:
echo hgdfjg678gfdg kjg45nn | sed 's/.*\([0-9]\+\).*/\1/g'
但结果是: 五 如何提取:678和45? 提前谢谢!
答案 0 :(得分:13)
问题是.
中的.*
会匹配数字和非数字,并且只要它可以保持匹配 - 只要剩下一位数就行未消耗的,可以匹配[0-9]
。
不是提取数字,只需删除非数字:
echo hgdfjg678gfdg kjg45nn | sed 's/[^0-9]//g'
甚至
echo hgdfjg678gfdg kjg45nn | tr -d -c 0-9
答案 1 :(得分:6)
您可以将grep与选项-o一起使用:
$ echo hgdfjg678gfdg kjg45nn | grep -E -o "[0-9]+"
678
45
答案 2 :(得分:3)
或使用tr
:
$ echo hgdfjg678gfdg kjg45nn | tr -d [a-z]
678 45
答案 3 :(得分:1)
.*
中的 sed
贪婪。并且没有non-greedy
选项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