Linux的shell:字符编码的条件转换,多个文本文件

问题描述:

的情况: 我有一堆的文本文件(.CSV,要准确),20000左右,在字符编码不同:file -i *.csv给我charset=us-ascii大多数,但有些是utf-16leLinux的shell:字符编码的条件转换,多个文本文件

目标: 我希望它们都以相同的方式进行编码,us-ascii在这里。我想到一个单线程检查目录中的每个文件的编码,如果它是utf-16le,它将它转换为us-ascii

我几天前才开始学习bash编程,所以这个还是逃不过我。是否有可能,就像在每个文件上运行文件-i(这样做),捕获返回值,检查给定的编码以及它是否不是us-ascii,将其转换?

感谢您帮助我了解如何做到这一点!

请尝试以下命令:

iconv -f FROM-ENCODING -t TO-ENCODING *.csv 

,用适当的值替换FROM-ENCODINGTO-ENCODING

您可以使用以下脚本或类似的东西来满足您的需求。您也可以使用recode命令。

recode FROM-ENCODING..TO-ENCODING file.csv 

最后,看看这个Best way to convert text files between character sets?如果你有兴趣了解更多关于iconv和/或recode

+0

解析ls的输出结果是有害的,用匹配。 – 2013-05-12 22:12:54

+0

http://mywiki.wooledge.org/ParsingLs – 2013-05-12 22:14:09

+0

@AdrianFrühwirth是的,当文件名有空格时,这可能是一个问题....谢谢。 – Bill 2013-05-12 22:15:09

的其他解决方案不关心文件的混合,这听起来像一个解决方案感:

for F in *.csv; do 
    if [ `file -i "$F" | awk '{print $3;}'` = "charset=utf-16" ]; then 
     iconv -f UTF-16 -t US-ASCII "$F" > "u.$F" 
    fi 
done 

是什么使得它更容易被US-ASCII和UTF-16中的第几(128)字符的身份 - 所以,如果该文件确实是US-ASCII,转换不会做任何危害。

这将转换任何非US-ASCII编码*.csv文件US-ASCII:

#!/bin/bash 
for f in *.csv;do 
    charset=`file -i README.md |grep -o 'charset=.*'|cut -d= -f2` 
    if [ "$charset" != "us-ascii" ];then 
     echo "$f $charset -> us-ascii" 
     iconv -f "$charset" -t us-ascii < "$f" > "$f.tmp" \ 
     && mv "$f.tmp" "$f" 
    fi 
done 
+0

请引用您的变量来说明文件名中的空格。 – 2013-05-12 22:36:02

+0

对,修正了这个问题。 – rzymek 2013-05-13 08:00:30