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

