如何用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
相关产品推荐
相关产品推荐

