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

