Linux的shell:字符编码的条件转换,多个文本文件
的情况: 我有一堆的文本文件(.CSV,要准确),20000左右,在字符编码不同:file -i *.csv
给我charset=us-ascii
大多数,但有些是utf-16le
。Linux的shell:字符编码的条件转换,多个文本文件
目标: 我希望它们都以相同的方式进行编码,us-ascii在这里。我想到一个单线程检查目录中的每个文件的编码,如果它是utf-16le
,它将它转换为us-ascii
。
我几天前才开始学习bash编程,所以这个还是逃不过我。是否有可能,就像在每个文件上运行文件-i(这样做),捕获返回值,检查给定的编码以及它是否不是us-ascii,将其转换?
感谢您帮助我了解如何做到这一点!
请尝试以下命令:
iconv -f FROM-ENCODING -t TO-ENCODING *.csv
,用适当的值替换FROM-ENCODING
和TO-ENCODING
。
您可以使用以下脚本或类似的东西来满足您的需求。您也可以使用recode
命令。
recode FROM-ENCODING..TO-ENCODING file.csv
最后,看看这个Best way to convert text files between character sets?如果你有兴趣了解更多关于iconv
和/或recode
的其他解决方案不关心文件的混合,这听起来像一个解决方案感:
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
请引用您的变量来说明文件名中的空格。 – 2013-05-12 22:36:02
对,修正了这个问题。 – rzymek 2013-05-13 08:00:30
解析ls的输出结果是有害的,用匹配。 – 2013-05-12 22:12:54
http://mywiki.wooledge.org/ParsingLs – 2013-05-12 22:14:09
@AdrianFrühwirth是的,当文件名有空格时,这可能是一个问题....谢谢。 – Bill 2013-05-12 22:15:09