Shell脚本处理CSV字段时,如何移除字符串引号同时保留空格?
解决方法:保留空格并正确处理带引号的CSV字段
你的脚本目前遇到两个核心问题:一是传递参数时没保留空格,二是没正确识别带引号且包含分隔符(逗号)的CSV字段。下面是分步修复方案:
1. 先解决空格丢失的问题
看你调用strip_quotes的写法:strip_quotes $secretValue,这里$secretValue没加双引号包裹,bash会把变量里的空格当成参数分隔符,导致函数只接收到第一个空格前的内容。同时函数里的反引号写法也可以优化,避免不必要的子shell开销。
修正后的函数和调用方式:
strip_quotes() { sed -e 's/^"//' -e 's/"$//' <<<"$1" } # 调用时必须用双引号包裹变量,确保空格完整传递 echo "$(strip_quotes "$secretValue")"
2. 正确处理带引号的CSV字段
就算修复了空格问题,直接用IFS=, read还是会把带引号字段里的逗号当成分隔符,导致字段读取截断。对于带引号的CSV,我们可以用awk来处理,它能精准识别引号包裹的字段:
最终可用的脚本
#!/bin/bash strip_quotes() { sed -e 's/^"//' -e 's/"$//' <<<"$1" } # 用awk的FPAT规则识别带引号的CSV字段,提取第三个字段后处理 awk -F',' 'BEGIN{FPAT = "([^,]+)|(\"[^\"]+\")"} {print $3}' process-file.csv | while read -r secretValue; do echo "$(strip_quotes "$secretValue")" done
执行后的正确输出
运行这个脚本后,你会得到完整的连接字符串,所有空格都被保留:
Server=database.windows.net,1433;Database=sqldb;Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
关键逻辑解释
awk的FPAT参数定义了字段匹配规则:([^,]+)|(\"[^\"]+\")表示字段要么是不含逗号的普通字符串,要么是双引号包裹的任意内容(包括逗号),完美适配CSV的格式规范。- 始终用双引号包裹变量传递,确保空格、特殊字符不会被bash拆分。
- 去掉了函数里多余的
echo和反引号,直接让sed输出结果,更高效简洁。
如果你不想用awk,也可以用专门的CSV工具csvkit(需提前安装),一行就能搞定:
csvcut -c 3 process-file.csv | sed 's/^"//;s/"$//'
内容的提问来源于stack exchange,提问作者JhnWorks
相关产品推荐
相关产品推荐

