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

sed正则替换时匹配首个双右括号而非末尾双右括号的问题

问题原因

POSIX 正则默认采用贪婪匹配规则,.* 会尽可能匹配最长的字符串直到行尾,而[^)]仅能匹配非右括号的字符,遇到单个右括号就会终止,因此无法覆盖包含单个右括号、但未到目标连续双右括号的区间。

解法1:Perl 命令(写法最简单)

Perl 原生支持非贪婪匹配,直接用一行命令即可实现需求:

perl -pi -e 's/\s:hello.*?\)\)//' 目标文件名

参数说明:

  • -i 直接修改原文件,效果和 sed -i 一致
  • .*? 是非贪婪匹配标记,会尽可能短的匹配字符,直到遇到首个))就停止,刚好删除:hello到首个连续双右括号的所有内容,符合替换要求。

解法2:纯 Sed 兼容解法

如果环境只能使用 sed,可以通过临时占位符的方式绕过非贪婪限制:

sed -i -E 's/))/\x00/g; s/\s:hello[^\x00]*\x00//; s/\x00/))/g' 目标文件名

逻辑说明:

  1. 第一步先把全文所有的))临时替换为不可见字符\x00(普通文本几乎不会出现该字符,无冲突风险)
  2. 第二步匹配从空格:hello开始,所有非\x00的字符直到遇到\x00,全部删除
  3. 第三步把剩余的\x00还原为))

如果所用环境的 sed 不支持\x00,可以替换为任意不会在文本中出现的特殊字符串,比如@_@,命令调整为:

sed -i -E 's/))/@_@/g; s/\s:hello[^@]*@_@//; s/@_@/))/g' 目标文件名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:45:04