Unix下替换CSV第三字段内双引号为~(保留其他双引号)
处理CSV文件指定字段的内嵌双引号替换需求
需求说明:
- 在Unix环境下处理双引号包裹的CSV文件
- 仅将第三个HTML格式字段内的转义双引号(
\")替换为~ - 该字段包含数据逗号,不得修改其他位置的双引号
- 此前尝试awk命令未达到预期效果
输入文件示例
F1,F2,F3 "11111","ABABDBDA","<div style=\"text-aaa: justify;\"> Il MMM delinea l’evvv dei ccccc e dei ruorrrrli, degli organi sss, alaaaala " "22222","PPPPPPPP","<p style=\"text-align: justify;\"> <span style=\"color:#ff0000;\"><strong>Disponibile dal 25/03</strong></span></p> <div style=\"text-align: justify;\"> Il manuale delinea l’evoluzione dei , ;\"> </div>" "333333","QQQQQQQ","<p style=\"text-align: justify;\"> Il libro analizza i singoli cicli gestionali, partendo dalle rilevazioni, contabili per giungere poi alla destinazione di "
预期输出示例
F1,F2,F3 "11111","ABABDBDA","<div style=~text-aaa: justify;> Il MMM delinea l’evvv dei ccccc e dei ruorrrrli, degli organi sss, alaaaala" "22222","PPPPPPPP","<p style=~text-align: justify;~> <span style=~color:#ff0000;~><strong>Disponibile dal 25/03</strong></span></p> <div style=~text-align: justify;~> Il manual" "333333","QQQQQQQ","<p style=~text-align: justify;~> Il libro analizza i singoli cicli gestionali, partendo dalle rilevazioni, contabili per giungere poi alla destinazione"
解决方案(awk实现)
利用awk的逐字符遍历和状态跟踪,精准定位第三个字段并替换目标字符:
awk -v FS="" ' NR == 1 {print; next} { quote_cnt = 0 idx = 1 while (idx <= NF) { if ($idx == "\"") { quote_cnt++ } # 处于第三个字段内部(已进入第三个字段,未遇到结束引号) if (quote_cnt == 5) { # 匹配转义双引号组合:\ 后跟 " if ($idx == "\\" && $(idx+1) == "\"") { printf "~" idx += 2 continue } } printf "%s", $idx idx++ } printf "\n" } ' input.csv > output.csv
核心逻辑说明
- 字段定位:通过统计双引号数量区分字段——前两个字段各包含一对双引号,第三个字段从第5个双引号开始,到第6个双引号结束
- 逐字符处理:设置
FS=""将每行拆分为单个字符,避免字段内逗号干扰分割逻辑 - 精准替换:仅在第三个字段范围内,将转义双引号的字符组合
\"替换为~,其他字符和双引号保持不变 - 表头跳过:第一行表头直接输出,不做任何处理
内容的提问来源于stack exchange,提问作者Rajesh Kumar
相关产品推荐
相关产品推荐

