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

如何用sed替换字符串中引号外的%为^%?

Sed实现:引号外的%替换为^%,引号内保留原%

需求与示例

  • 核心需求:遍历字符串,将引号外的所有%替换为^%,引号内的%保持原样
  • 示例对比:
    原字符串:r%"%a"%n"%d%"o%"%%m
    转换后:r^%"%a"^%n"%d%"o^%"^%^%m

问题背景

此前类似场景的Sed方案会触发无限循环,原因是分支标签:t在无匹配替换时仍强制跳转,导致死循环。本文提供的方案通过精准匹配引号内外状态,避免了这一问题。

可行的Sed命令

sed -E ':t
s/^(([^"%]|"%")*)%/\1^%/
t t
s/^(([^"]|"%")*)"/\1"/
t t'

命令原理说明

  1. :t:定义循环标签,用于重复处理直到无匹配项
  2. 第一个替换规则:s/^(([^"%]|"%")*)%/\1^%/
    • 匹配逻辑:从行首开始,匹配所有「非引号非%的字符」或「成对引号包裹的内容」,直到遇到第一个引号外的%
    • 替换动作:将该引号外的%替换为^%
  3. t t:仅当替换成功时,跳回:t标签继续处理;无匹配则执行后续步骤
  4. 第二个替换规则:s/^(([^"]|"%")*)"/\1"/
    • 作用:处理引号配对,确保后续能正确识别引号内外状态,避免遗漏跨引号的%
    • 同样通过t t实现循环处理,直到所有引号配对状态都被正确识别

测试验证

将示例原字符串传入该命令,输出结果与预期完全一致:

echo 'r%"%a"%n"%d%"o%"%%m' | sed -E ':t
s/^(([^"%]|"%")*)%/\1^%/
t t
s/^(([^"]|"%")*)"/\1"/
t t'
# 输出:r^%"%a"^%n"%d%"o^%"^%^%m

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:03:16