如何编写通用代码替换文件中引号包裹数据内的分隔符
通用解决方案
针对引号内不定数量逗号的替换需求,提供两种可行方案:
方案1:sed 循环替换(兼容原使用习惯)
利用sed的标签循环特性,反复匹配引号内的逗号并替换,直到没有符合规则的逗号为止:
echo '"1","2,3,4,5","6","7,8"' | sed -E ':loop s/"([^"]*),([^"]*)"/"\1;\2"/g; t loop'
命令说明:
:loop定义一个名为loop的标签s/"([^"]*),([^"]*)"/"\1;\2"/g每次匹配一对引号内的第一个逗号,替换为分号t loop如果上一次替换成功,就跳回loop标签重复执行,直到没有替换发生为止- 不管引号内有多少个逗号、有多少个带逗号的字段,都可以自动处理
方案2:awk 专用CSV处理(更稳定,适合复杂CSV)
如果CSV结构更复杂(比如有转义引号等场景),用awk的FPAT字段匹配特性更稳妥:
awk -v FPAT='[^,]*|"[^"]+"' -v OFS=',' '{ for(i=1;i<=NF;i++){ if($i ~ /^"/) gsub(/,/,";",$i) } print }' 你的文件路径
命令说明:
FPAT='[^,]*|"[^"]+"'定义CSV字段的匹配规则:要么是不带逗号的普通字段,要么是被双引号包裹的字段- 遍历每个字段,只要是被双引号包裹的字段,就把内部的逗号全部替换为分号
- 处理完所有字段后按原分隔符逗号输出
测试效果
针对你给出的示例输入:
"1","2,3,4,5","6","7,8" "1","2,4,5","6","7,8,9" "1","4,5","6","7,8,9.2"
两种方案输出结果均为:
"1","2;3;4;5","6","7;8" "1","2;4;5","6","7;8;9" "1","4;5","6","7;8;9.2"
内容的提问来源于stack exchange,提问作者Neeraj
相关产品推荐
相关产品推荐

