file、awk 和 iconv 自动适应 tex 文件编码

file、awk 和 iconv 自动适应 tex 文件编码

我有一组混合编码的 tex 文件,例如(输出的子集file -i *.tex

f1.tex: text/plain; charset=utf-8
f2.tex: text/plain; charset=utf-8
f3.tex: text/x-tex; charset=us-ascii
f4.tex: text/plain; charset=iso-8859-1
f5.tex: text/plain; charset=us-ascii

我想将它们全部转换为utf-8,尤其是那些编码的iso-8859-1.我可以使用(或类似的)手动执行此操作

iconv -f ISO-8859-1 -t UTF-8 f4.tex > tmp && mv tmp f4.tex

但我认为结合使用awk上述内容是很可能的,即file -i使用 运行解析文件/编码组合awk并相应地使用 执行编码转换iconv

我的了解awk相当有限。我没有比这更进一步的了:

$ file -i *.tex | awk '{print $1, $3}'
f1.tex: charset=utf-8
f2.tex: charset=utf-8
f3.tex: charset=us-ascii
f4.tex: charset=iso-8859-1
f5.tex: charset=us-ascii

任何帮助表示赞赏!特别是,我不知道如何从列中去除冒号:和子字符串。charset=

答案1

似乎在这里使用 sed 而不是 awk 更好:

file -i *tex | sed \ 
's/^\([^:]*\): .*set=\(.*\)/iconv -f \2 -t UTF-8 \1 > tmp \&\& mv tmp \1/e'

它将执行sed基于file -i输出的命令。如果您想查看命令列表而不执行,只需删除esed 脚本末尾的标志,如下所示:

file -i *tex | sed \
's/^\([^:]*\): .*set=\(.*\)/iconv -f \2 -t UTF-8 \1 > tmp \&\& mv tmp \1/'

相关内容