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

如何使用sed仅替换文件中冒号左侧的所有短横线(-)为下划线(_)?

如何使用sed仅替换文件中冒号左侧的所有短横线(-)为下划线(_)?

嘿,我来帮你搞定这个sed的问题!你之前的命令出错是因为sed的替换字符串里不能直接写正则表达式——你把匹配到的内容直接换成了正则规则本身,这才导致结果不对。咱们来一步步修正:

核心思路

我们需要精准定位冒号左侧的短横线,保留其他内容,只把-换成_。因为你用的是Mac上的BSD sed,和GNU sed语法略有不同,得注意参数写法。

1. 替换冒号左侧的单个短横线

如果你的冒号左侧只有一个-,可以用捕获组来保留前后内容,只替换中间的-:

sed -i '' 's/\("\?[a-zA-Z0-9_]*\)-\([a-zA-Z0-9_"]*\):/\1_\2:/g' file.txt
  • \("\?[a-zA-Z0-9_]*\):捕获冒号左侧-前面的内容(包括可能的引号)
  • -:匹配我们要替换的短横线
  • \([a-zA-Z0-9_"]*\)::捕获-后面到冒号的内容
  • \1_\2::把捕获的第一部分、下划线、第二部分拼接起来,替换原来的匹配内容

2. 替换冒号左侧的多个短横线

如果冒号左侧有多个-(比如"text-desc-1": ...),上面的命令只能替换一个,这时候需要循环替换直到所有-都被处理:

sed -i '' ':loop; s/\("\?[a-zA-Z0-9_]*\)-\([a-zA-Z0-9_"]*\):/\1_\2:/g; t loop' file.txt
  • :loop:定义一个循环标签
  • t loop:如果上一次替换成功,就跳回loop标签继续执行,直到没有可替换的-为止

举个例子

假设你的文件内容是:

"text_description-1": "Some text-with-dash".
"another-text-here": "more-text-keep".

执行命令后会变成:

"text_description_1": "Some text-with-dash".
"another_text_here": "more-text-keep".

可以看到,冒号右侧的-完全没被改动,完美符合你的需求!

备注:内容来源于stack exchange,提问作者sanjay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 15:04:28