您可以考虑替换字段分隔符逗号,而不是干扰明显的源数据,即引号内的内容:
s/,([^,"]*|"[^"]*")(?=(,|$))/|$1/g
请注意,这也处理未引用的字段。
就这个数据而言:"H",9,"YES","NO","4,5","Y","N"
$ perl -pe 's/,([^,"]*|"[^"]*")(?=(,|$))/|$1/g' commasep
"H"|9|"YES"|"NO"|"4,5"|"Y"|"N"
之后可以用“|”分割:
$ perl -ne 's/,([^,"]*|"[^"]*")(?=(,|$))/|$1/g;print join "---",split "\\|"' commasep
"H"---9---"YES"---"NO"---"4,5"---"Y"---"N"