求助:如何用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
相关产品推荐
相关产品推荐

