12

我尝试用 sed 提取数字:

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

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

4

4 回答 4

18

问题是.in.*将匹配数字和非数字,并且它会一直匹配,只要它可以 - 只要有一个未使用的数字可以匹配[0-9].

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

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

甚至

echo hgdfjg678gfdg kjg45nn | tr -d -c 0-9
于 2011-09-12T18:18:45.980 回答
8

You may use grep with option -o for this:

$ echo hgdfjg678gfdg kjg45nn | grep -E -o "[0-9]+"
678
45
于 2011-09-12T18:19:14.727 回答
3

或使用tr

$ echo hgdfjg678gfdg kjg45nn | tr -d [a-z]
678 45
于 2011-09-12T20:26:04.917 回答
2

.*insed是贪婪的。而且没有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
于 2017-05-31T05:23:48.160 回答