You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何去除Unix文件中CSV字段内的多余双引号和换行符

问题描述

我有一个CSV文件,字符串和日期字段用双引号包裹,但字段内部出现了多余双引号和换行符。

示例输入:

"1234","asdf","with"doublequotes","new line
feed","withmultiple""doublequotes"

期望输出:

"1234","asdf","withdoublequotes","new linefeed","withmultipledoublequotes"

我尝试过以下sed命令:

sed 's/\([^",]\)"\([^",]\)/\1\2/g;s/\([^",]\)""/\1"/g;s/""\([^",]\)/"\1/g' < infile > outfile

但该命令会移除字符串中的双引号,且丢失最后一个双引号,结果如下:

"1234","asdf","withdoublequotes","new line
feed","withmultiple"doublequotes

请问是否有方法去除字段内(即",和,"之间)的多余双引号和换行符?

解决方案

方法一:使用awk处理(推荐)

awk能更精准识别CSV字段边界,同时处理跨行内容,脚本如下:

BEGIN {
    FS = "\""
    OFS = "\""
    full_content = ""
}
{
    full_content = full_content $0
}
END {
    split_count = split(full_content, parts, "\"")
    for (i = 1; i <= split_count; i++) {
        # 偶数索引的部分是双引号包裹的字段内部内容
        if (i % 2 == 0) {
            gsub(/"/, "", parts[i])  # 移除字段内所有多余双引号
            gsub(/\n/, "", parts[i]) # 移除字段内所有换行符
        }
        # 按原格式拼接输出,最后一行加换行
        printf "%s%s", parts[i], (i == split_count ? "\n" : OFS)
    }
}

使用方式:

  1. 将上述脚本保存为clean_csv.awk
  2. 执行命令:
awk -f clean_csv.awk infile > outfile

方法二:使用GNU sed处理

如果需要用sed,需使用支持跨行操作的GNU sed,命令如下:

sed -z 's/"\([^"]*\)"/"\1"/g;s/\([^",]\)"\([^",]\)/\1\2/g;s/\n//g' infile > outfile

说明:

  • -z选项让sed把整个文件当作单行处理,解决跨行字段的问题
  • 第一个替换规则确保字段边界的双引号保留
  • 第二个替换规则移除字段内部的单个多余双引号
  • 第三个替换规则移除所有换行符

内容的提问来源于stack exchange,提问作者vishnu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:03:49