【问题标题】:LInux shell: conditional conversion of character encoding, multiple text filesLINux shell:字符编码的条件转换,多个文本文件
【发布时间】:2013-05-06 21:25:36
【问题描述】:

情况: 我有一堆文本文件(准确地说是.csv),大约 20000 个字符编码不同:file -i *.csv 给我charset=us-ascii 大部分是utf-16le

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

我是几天前才开始学习 bash 编程的,所以这个我仍然无法理解。是否有可能,例如在每个文件上运行 file -i(这样做),捕获返回值,检查给出的编码,如果不是 us-ascii,则转换它?

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

【问题讨论】:

    标签: linux bash character-encoding ascii utf-16


    【解决方案1】:

    请尝试以下命令:

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

    并将FROM-ENCODINGTO-ENCODING 替换为适当的值。

    您可以根据需要使用以下脚本或类似的脚本。

    for file in  *.csv
    do
        iconv -f FROM-ENCODING -t TO-ENCODING "$file" > "$file.new"
    done
    

    您也可以使用recode 命令。

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

    最后,如果您有兴趣了解有关iconv 和/或recode 的更多信息,请查看此Best way to convert text files between character sets?

    【讨论】:

    • 解析ls的输出是有害的,使用globbing。
    • @AdrianFrühwirth 是的,当文件名有空格时,这可能是个问题......谢谢。
    • 你还需要引用你的变量,否则它不会解决任何问题;-)
    • 我只看到 $file,但如果还有其他人也可以随意引用它们。始终引用,尤其是在处理文件名时。
    • @AdrianFrühwirth 非常感谢您帮助改进答案:)
    【解决方案2】:

    其他解决方案不关心文件的混合,这听起来像是以下意义上的解决方案:

    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
    

    更容易的是前几个 (128) 个字符中 us-ascii 和 utf-16 的标识 - 因此,如果文件确实是 us-ascii,则转换不会造成任何伤害。

    【讨论】:

      【解决方案3】:

      这会将任何非 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
      

      【讨论】:

      • 请引用您的变量以说明文件名中的空格。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多