You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用sed捕获字符串中的数字?我的sed脚本为何无输出?

为什么你的sed脚本没有输出?

我来帮你拆解问题所在,以及怎么修复:

首先,你的sed命令有几个关键问题,导致没有任何输出:

1. sed默认不支持\d匹配数字

sed默认使用Basic Regular Expressions (BRE),而\d是Perl兼容正则(PCRE)里的简写,BRE根本不认识这个符号。你需要用[0-9]或者POSIX标准的[[:digit:]]来匹配数字。

2. BRE里量词{6}需要转义

在BRE模式下,像{n}这种表示重复次数的量词必须转义成\{6\},否则sed会把{6}当成普通的字符来匹配,自然找不到符合条件的内容。

3. 贪婪匹配会导致漏抓结果(即使前面问题修复了)

你的正则.*"\(\d{6}\),里的.*是贪婪匹配,会直接跳到字符串最右边的引号位置,就算修复了前面的语法问题,也只会提取最后一个6位数字,而不是你想要的两个。


修复后的sed命令

这里给你一个可以正确提取两个数字的sed命令:

echo '["770001,德邦优化混合","750005,安信平稳增长混合发起A"]' | sed -n ':loop; s/[^"]*"\([0-9]\{6\}\),/\1 /; t loop; s/ $//; p'

命令解释:

  • :loop:定义一个循环标签,方便后续重复处理字符串
  • s/[^"]*"\([0-9]\{6\}\),/\1 /:匹配第一个引号前的所有非引号字符,然后捕获引号后的6位数字,把匹配到的部分替换成数字加空格
  • t loop:如果替换操作成功(也就是找到一个数字),就跳回loop标签继续处理剩下的字符串
  • s/ $//:去掉最后多余的空格
  • p:打印最终处理后的结果

运行这个命令,就能得到你期望的输出:770001 750005

如果你习惯用扩展正则(ERE),也可以用-E选项简化语法,不需要转义量词:

echo '["770001,德邦优化混合","750005,安信平稳增长混合发起A"]' | sed -E -n ':loop; s/[^"]*"([0-9]{6}),/\1 /; t loop; s/ $//; p'

内容的提问来源于stack exchange,提问作者jasonxia23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:57:48