如何在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
相关产品推荐
相关产品推荐

