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

如何使用sed仅替换字符串中的特定部分?(含实操示例)

用sed替换指定位置前的下划线为短横线

输入字符串:async_task_payload_manager_scripts_artifact_1.0.0-2

原执行命令:

echo "async_task_payload_manager_scripts_artifact_1.0.0-2" |
sed 's/\_(\_scripts_artifact_)./\-(\_scripts_artifact_).*/g'

执行后输出和原字符串一致,未达到预期。

期望输出:async-task-payload-manager_scripts_artifact_1.0.0-2(仅将_scripts_artifact_之前的下划线替换为短横线)

原命令问题分析

原sed表达式逻辑错误:

  • 括号在基础sed中是普通字符,未正确使用捕获组
  • 匹配规则没有定位到_scripts_artifact_之前的下划线,反而试图匹配包含该字符串的片段,导致无匹配替换

正确的sed命令

这里提供两种可行的sed写法:

方法1:分步替换+反向修正

echo "async_task_payload_manager_scripts_artifact_1.0.0-2" | sed -E 's/(.*)(_scripts_artifact_)/\1_\2/; s/_/-/g; s/-(_scripts_artifact_)/_\1/'

步骤说明:

  1. 先将字符串拆分为_scripts_artifact_前后两部分,确保分界清晰
  2. 将所有下划线替换为短横线
  3. 把误替换的-_scripts_artifact_还原为_scripts_artifact_

方法2:利用保持空间精准处理

echo "async_task_payload_manager_scripts_artifact_1.0.0-2" | sed -E '/_scripts_artifact_/{h;s/_.*/_/;s/_/-/g;G;s/(.*)\n(.*_scripts_artifact_.*)/\1\2/}'

步骤说明:

  1. 匹配包含_scripts_artifact_的行,将整行内容存入保持空间
  2. 删除当前行中_scripts_artifact_及之后的内容,把剩余部分的下划线全换成短横线
  3. 取出保持空间的原始内容,拼接处理后的前半段和原始后半段

内容的提问来源于stack exchange,提问作者Mr.Nobody

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:39:51