sed 提取数字

发布于 2024-12-04 05:30:41 字数 141 浏览 1 评论 0原文

我尝试用 sed: 提取数字:

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

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

I try to extract digits with sed:

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

but result is:
5
How to extract: 678 and 45?
Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

陈独秀 2024-12-11 05:30:41

问题是 .* 中的 . 将匹配数字和非数字,并且它会尽可能长时间地匹配 - 即只要还有一位未使用的数字可以与 [0-9] 匹配。

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

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

甚至

echo hgdfjg678gfdg kjg45nn | tr -d -c 0-9

The problem is that the . in .* will match digits as well as non-digits, and it keeps on matching as long as it can -- that is as long as there's one digit left unconsumed that can match the [0-9].

Instead of extracting digits, just delete non-digits:

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

or even

echo hgdfjg678gfdg kjg45nn | tr -d -c 0-9
满地尘埃落定 2024-12-11 05:30:41

您可以使用带选项 -o 的 grep 来执行此操作:

$ echo hgdfjg678gfdg kjg45nn | grep -E -o "[0-9]+"
678
45

You may use grep with option -o for this:

$ echo hgdfjg678gfdg kjg45nn | grep -E -o "[0-9]+"
678
45
当梦初醒 2024-12-11 05:30:41

或者使用tr

$ echo hgdfjg678gfdg kjg45nn | tr -d [a-z]
678 45

Or use tr:

$ echo hgdfjg678gfdg kjg45nn | tr -d [a-z]
678 45
小矜持 2024-12-11 05:30:41

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

.* in sed is greedy. And there are no non-greedy option AFAIK.
(You must use [^0-9]* in this case for non-greedy matching. But this works only once, so you will get only 678 without 45.)

If you must use only sed, it would not be easy to get the result.
I recommend to use gnu’s grep

$ echo hgdfjg678gfdg kjg45nn | grep -oP '\d+'
678
45

If you really want to stick to sed, this would be one of many possible answers.

$ 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文