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/'

相關內容