我尝试用 sed 提取数字:
echo hgdfjg678gfdg kjg45nn | sed 's/.*\([0-9]\+\).*/\1/g'
但结果是:5 如何提取:678 和 45?提前致谢!
问题是.
in.*
将匹配数字和非数字,并且它会一直匹配,只要它可以 - 只要有一个未使用的数字可以匹配[0-9]
.
而不是提取数字,只需删除非数字:
echo hgdfjg678gfdg kjg45nn | sed 's/[^0-9]//g'
甚至
echo hgdfjg678gfdg kjg45nn | tr -d -c 0-9
You may use grep with option -o for this:
$ echo hgdfjg678gfdg kjg45nn | grep -E -o "[0-9]+"
678
45
或使用tr
:
$ echo hgdfjg678gfdg kjg45nn | tr -d [a-z]
678 45
.*
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