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

Linux Shell:如何移除字符串中包裹数字的前后三个下划线?

解决sed替换中保留匹配数字的问题

你的思路方向是对的,但要让sed保留匹配到的数字,需要用到捕获组和反向引用——你的初步尝试里直接用[0-9]作为替换内容,其实是把匹配段替换成了字面量字符串[0-9],而不是实际捕获到的数字。

支持多位数字的正确命令

考虑到数字可能是1位或多位(比如你的示例里的45),这里提供两种实现方式:

方式1:使用sed默认的基本正则

var="This is my ___ va__riable ___for___ num_ber ___45___"
echo "$var" | sed 's/___\([0-9]\+\)___/\1/'

方式2:使用扩展正则(语法更简洁)

echo "$var" | sed -E 's/___([0-9]+)___/\1/'

命令细节解释

  • ___:精准匹配连续三个下划线的前缀和后缀
  • \([0-9]\+\)(基本正则)或([0-9]+)(扩展正则):用捕获组包裹任意长度的数字序列,把匹配到的数字临时存储起来
  • \1:反向引用第一个捕获组的内容,也就是我们刚才捕获到的数字,用它替换整个___数字___的匹配段
  • 给$var加双引号"$var"很关键:避免shell把变量里的空格拆分成多个参数,导致输出内容错乱

测试结果

执行上述命令后,输出会完全符合你的需求:

This is my ___ va__riable ___for___ num_ber 45

仅移除了包裹数字的前后三个下划线,其他下划线(比如va__riable里的双下划线、num_ber里的单下划线)都被完整保留。

内容的提问来源于stack exchange,提问作者Sopalajo de Arrierez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:03:48