sed提取数字

时间:2011-09-12 18:13:46

标签: sed extract digits

我尝试用sed提取数字:

echo hgdfjg678gfdg kjg45nn | sed 's/.*\([0-9]\+\).*/\1/g'

但结果是: 五 如何提取:678和45? 提前谢谢!

4 个答案:

答案 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