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

Linux Bash中sscanf的等效实现:提取字符串中间数字

在Bash中提取字符串中间的数字(类似C语言sscanf的实现)

嘿,这个场景我太熟悉了!在Bash里完全可以实现和C语言sscanf类似的精准提取效果,针对你给出的固定格式字符串,我给你分享几个实用的方案:

方案1:纯Bash参数扩展(无外部命令,效率最高)

这种方法利用Bash内置的字符串处理能力,不需要调用任何外部工具,速度最快:

APPLES_STR="We have 123 apples."
# 第一步:移除字符串开头到"We have "的所有内容
temp="${APPLES_STR#*We have }"
# 第二步:移除字符串结尾从" apples."开始的所有内容
NUM="${temp% apples.}"

echo $NUM  # 输出结果:123

这里的#*表示从字符串开头删除匹配到的最短模式,%表示从字符串结尾删除匹配到的最短模式,完美对应你固定格式的字符串结构。

方案2:用sed做正则匹配提取

如果你的字符串格式偶尔有小变动,或者需要更灵活的正则匹配,sed是个不错的选择:

APPLES_STR="We have 123 apples."
NUM=$(echo "$APPLES_STR" | sed -n 's/We have \([0-9]*\) apples./\1/p')

echo $NUM  # 输出结果:123

解释一下:

  • -n 让sed只输出我们指定的内容
  • s/原模式/替换内容/p 是替换命令,这里用\([0-9]*\)捕获数字部分,再用\1引用这个捕获组,最后只输出提取到的数字

方案3:用awk提取字段

如果你的字符串是用空格分隔的固定字段结构,awk会更简单直接——因为数字刚好是第三个字段:

APPLES_STR="We have 123 apples."
NUM=$(echo "$APPLES_STR" | awk '{print $3}')

echo $NUM  # 输出结果:123

这种方法特别适合字段清晰的文本,代码简洁到离谱。

通用方案:提取所有数字(适合格式不固定的场景)

如果字符串里只有一个数字,或者你需要提取所有数字,还可以用grep:

APPLES_STR="We have 123 apples."
NUM=$(echo "$APPLES_STR" | grep -o '[0-9]*')

echo $NUM  # 输出结果:123

-o参数让grep只输出匹配到的部分,[0-9]*匹配任意长度的数字串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:31:37