Linux下如何移除双引号内的逗号(保留分隔符逗号)
移除双引号包裹字段内的逗号(保留分隔符逗号)
解决方案1:使用awk(更可靠)
awk处理带引号的CSV字段逻辑更清晰,直接针对双引号内的内容处理:
awk -F'"' '{for(i=2;i<=NF;i+=2) gsub(/,/,"",$i)} 1' OFS='"' test.txt
命令解释:
-F'"':将双引号设置为字段分隔符,每行被拆分为「空字符串/分隔符段」和「双引号内的字段内容段」交替的结构。- 循环
for(i=2;i<=NF;i+=2):只处理偶数索引的字段(这些正是双引号包裹的列内容),用gsub把字段内的所有逗号替换为空。 1:awk的简写,代表执行默认操作——打印当前处理后的整行;OFS='"'确保输出时用双引号拼接字段,还原原格式。
解决方案2:使用sed
如果偏好sed,修正后的命令如下(注意直接用双引号而非HTML实体"):
sed -E ':a; s/("[^"]*),([^"]*")/\1\2/; ta' test.txt
命令解释:
-E:启用扩展正则表达式,避免对括号转义。:a:定义循环标签a。s/("[^"]*),([^"]*")/\1\2/:匹配双引号内部的逗号(左边是双引号开头+非引号字符,右边是非引号字符+双引号结尾),直接移除该逗号。ta:如果上一步替换成功,跳回标签a继续循环处理,直到当前行内没有双引号里的逗号为止。
你原来命令的问题
- 错误使用了HTML实体
",shell环境中直接用双引号"即可; - 你把逗号替换成了
~,但需求是移除逗号,应该直接将匹配到的逗号替换为空; - 原正则没有循环处理所有内部逗号,修正后的sed命令通过
ta实现了循环替换。
验证示例
输入行:
"2022111812160156601777153","","","false","test1","here the , issue , that comma comma come inside the column"
执行命令后输出:
"2022111812160156601777153","","","false","test1","here the issue that comma comma come inside the column"
内容的提问来源于stack exchange,提问作者Aya
相关产品推荐
相关产品推荐

