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

如何在Bash读取CSV文件时保留反斜杠字符?

问题

我正在读取以分号;分隔的CSV文件,示例文件file.csv内容如下:

a1;a2;/unixpath/file1;a4
b1;b2;\winpath\file2;b4

其中部分字段包含未加引号的Windows路径,带有反斜杠。我使用如下Bash脚本:

#!/bin/bash
fileIn="file.csv"
IFS=';'
while read -a lineV ; do
   #echo "lineV: '${lineV[@]}'"
   for ((c=0; c<=3; c++)); do
      field="${lineV[$c]}"
      echo -E "c:$c field:'$field' '${lineV[$c]}'"
   done
   echo "---"
done < $fileIn

但输出中反斜杠总是被忽略,结果如下:

c:0 field:'a1' 'a1'
c:1 field:'a2' 'a2'
c:2 field:'/unixpath/file1' '/unixpath/file1'
c:3 field:'a4' 'a4'
---
c:0 field:'b1' 'b1'
c:1 field:'b2' 'b2'
c:2 field:'winpathfile2' 'winpathfile2'
c:3 field:'b4' 'b4'
---

我尝试添加引号,也给echo加上了-E参数,但结果依旧。请问如何读取到字面的\反斜杠?

解决方案

问题根源是read命令默认会将反斜杠视为转义字符,自动丢弃它来解析后续字符,导致Windows路径中的反斜杠丢失。只需给read添加-r选项(启用原始模式,不处理转义字符),就能完整保留原始的反斜杠。

修改后的脚本:

#!/bin/bash
fileIn="file.csv"
IFS=';'
# 核心修改:添加-r选项
while read -r -a lineV ; do
   for ((c=0; c<=3; c++)); do
      field="${lineV[$c]}"
      echo -E "c:$c field:'$field' '${lineV[$c]}'"
   done
   echo "---"
done < "$fileIn"

执行后的正确输出:

c:0 field:'a1' 'a1'
c:1 field:'a2' 'a2'
c:2 field:'/unixpath/file1' '/unixpath/file1'
c:3 field:'a4' 'a4'
---
c:0 field:'b1' 'b1'
c:1 field:'b2' 'b2'
c:2 field:'\winpath\file2' '\winpath\file2'
c:3 field:'b4' 'b4'
---

额外建议:给$fileIn加上双引号"$fileIn",避免文件名包含空格、特殊字符时出现解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:32:30