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

为何使用Sed提取字符串中#后的数字未得到预期结果?

问题原因及解决方法

为什么当前命令输出不是预期的数字“4”?

你当前的sed命令 s/#\([0-9]\)/\1/ 本质是局部替换:它仅将字符串中的 #4 替换为 4,并没有删除前面的所有内容。而你之前提取端口号的命令 s/\(.*\):\(\d*\)/\2/ 是通过 .* 贪婪匹配了冒号前的所有内容,然后将整个字符串替换为捕获到的端口号,所以能得到纯数字结果。

正确的提取命令

方法1:全局替换提取

利用 .*# 贪婪匹配到最后一个 # 之前的所有内容,捕获其后的数字并替换整个字符串为该数字:

s="alsa_output.pci-0000_09_00.6.analog-stereo.monitor/#4"
echo $s | sed 's/.*#\([0-9]*\)/\1/'

输出:4

方法2:匹配打印模式

使用 -n 参数关闭默认输出,仅打印替换后的结果:

echo $s | sed -n 's/.*#\([0-9]*\)/\1/p'

输出:4

补充说明

如果#后的数字可能是多位,用 [0-9]* 比 [0-9] 更合适,后者仅匹配单个数字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:06:23