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

求助:如何用sed命令替换双引号内的单引号为\' '?

解决sed替换双引号内单引号的问题

我来帮你搞定这个sed替换的需求!你的目标是只替换双引号内部的单引号为\' ',而不影响双引号外的内容,之前的命令逻辑不对,而且单引号在shell和sed里的转义确实容易踩坑,下面给你可行的解决方案:

最终可用的sed命令

sed -E ':loop s/("[^"]*)'\''([^"]*")/\1\\'\'' '\2/g; t loop' test.csv

命令详解

咱们拆解一下这个命令的各个部分,方便你理解:

  • -E:启用扩展正则表达式,让正则语法更简洁易读
  • :loop:定义一个循环标签,因为双引号内可能有多个单引号,需要循环替换直到所有匹配都被处理
  • s/("[^"]*)'\''([^"]*")/\1\\'\'' '\2/g:这是核心的替换规则:
    • 匹配模式:("[^"]*)'\''([^"]*") 会精准匹配双引号内部包含一个单引号的片段:
      • ("[^"]*):匹配从双引号开始,到第一个单引号之前的所有非双引号内容
      • '\'':在shell单引号包裹的命令里,这是表示单个单引号的正确转义方式
      • ([^"]*"):匹配单引号之后,到闭合双引号之前的所有非双引号内容
    • 替换内容:\1\\'\'' '\2 把匹配到的单引号替换成\' ':
      • \1 和 \2 对应匹配模式里的两个捕获组,保留双引号内的原有内容
      • \\'\'' 就是转义后表示\' 的写法(shell和sed的双重转义需要注意)
  • t loop:如果上一次替换成功执行了,就跳转到loop标签继续循环,确保双引号内的所有单引号都被替换完成

测试验证

用你的输入示例测试:

输入:'gender':"Men's",'colour':'Red','name':"Men's levi's"
执行命令后输出:'gender':"Men\' 's",'colour':'Red','name':"Men\' 's levi\' 's"

完全符合你的期望!

注意事项

  • 这个命令适用于没有转义双引号的场景(比如你的输入里没有\"这种情况),如果有转义双引号的需求,需要调整正则逻辑
  • 该命令基于GNU sed编写,大部分Linux发行版默认都是GNU sed;如果是BSD sed(比如macOS默认的sed),可能需要把-E换成-r,并调整转义细节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:31:41