如何在zsh的while read循环中忽略字节顺序标记(BOM)
解决zsh脚本读取带BOM的CSV时忽略字节顺序标记的方法
Excel生成的UTF-8 CSV文件开头常带有\ufeff字节顺序标记(BOM),导致脚本读取第一行文件名时出错。以下是几种在while read操作中忽略BOM的实用方法:
方法1:用sed移除开头的BOM
直接通过sed替换掉文件第一行开头的BOM字符,再传入循环处理:
while IFS= read -r filename; do # 检查指定文件夹中是否存在该文件 if [[ ! -f "/目标文件夹路径/$filename" ]]; then echo "缺失文件: $filename" fi done < <(sed '1s/^\xef\xbb\xbf//' your_file.csv)
sed '1s/^\xef\xbb\xbf//'仅针对第一行,将开头的UTF-8 BOM字节序列替换为空,不影响后续行的内容。
方法2:用iconv转换编码去除BOM
利用iconv的编码转换功能,直接忽略BOM及无效字符:
while IFS= read -r filename; do if [[ ! -f "/目标文件夹路径/$filename" ]]; then echo "缺失文件: $filename" fi done < <(iconv -f UTF-8 -t UTF-8//IGNORE your_file.csv)
UTF-8//IGNORE会自动跳过UTF-8编码中的无效前缀(包括BOM),同时处理文件中可能存在的其他编码异常。
方法3:手动处理第一行的BOM
先单独读取第一行,通过参数展开移除开头的BOM字符,再处理剩余行:
# 读取第一行并去除BOM read -r first_line < your_file.csv first_line=${first_line#$'\ufeff'} # 检查第一行对应的文件 if [[ ! -f "/目标文件夹路径/$first_line" ]]; then echo "缺失文件: $first_line" fi # 处理剩余行 tail -n +2 your_file.csv | while IFS= read -r filename; do if [[ ! -f "/目标文件夹路径/$filename" ]]; then echo "缺失文件: $filename" fi done
这种方法逻辑直观,适合需要对第一行做特殊处理的场景。
内容的提问来源于stack exchange,提问作者Belphegor21
相关产品推荐
相关产品推荐

