如何用sed替换CSV字段内的嵌套双引号为三个单引号?
解决方案
使用awk(推荐,更可靠)
awk处理CSV字段分割场景更直观,能精准定位每个字段内部的引号并完成替换:
BEGIN{FS="\",\""; OFS="\",\""} {for(i=1; i<=NF; i++) {gsub(/"/, "'''", $i)} print "\""$0"\""}
工作原理
- 字段分割:将输入行按
","分割为多个字段,自动避开字段外的分隔符。 - 批量替换:遍历每个字段,把字段内所有的
"替换为'''。 - 格式恢复:分割操作会去掉首尾的
",输出时重新添加以保证CSV格式正确。
测试验证
- 输入:
"test","""","test"→ 输出:"test","''''''","test" - 输入:
"test","quotes "inside" quotes","test"→ 输出:"test","quotes '''inside''' quotes","test" - 输入:
"anything","inside "test" quotes","anything"→ 输出:"anything","inside '''test''' quotes","anything"
使用sed(需循环处理)
如果必须用sed,需要通过循环匹配字段内的引号,确保所有嵌套或零散的引号都被替换:
sed -E ':loop s/("[^",]*?)(")([^",]*?")/\1'\'''\''\3/g; t loop'
工作原理
- 循环标签
:loop定义循环入口。 - 非贪婪匹配:
[^",]*?精准匹配字段内的字符(不包含字段分隔符),定位字段内部的"。 - 循环替换:每次替换一个字段内的
"为''',t loop确保重复替换直到没有匹配项为止。
注意:该命令依赖sed的扩展正则支持(
-E参数),GNU sed和BSD sed均支持,但部分老旧版本可能需要调整。
内容的提问来源于stack exchange,提问作者DFox
相关产品推荐
相关产品推荐

