使用UNIX Bash脚本将文件名中的外语字符替换为英文等价字符

3
我正在尝试使用sed处理文件名列表,并将文件名中的每个外语字符替换为对应的英文字符。例如:
málaga.txt -> malaga.txt
我的脚本如下:
    for f in *.txt 
do
    newf=$(echo $f | sed 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/')
    mv $f $newf
done

这目前对文件名没有影响。但如果我使用同样的正则表达式处理文本文件,则会产生影响。例如:

cat blah.txt | sed 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/

它的表现非常完美 - 所有的外文字符都被替换为它们的英文对应字符。任何帮助将不胜感激。这是在 Mac OsX 中的 UNIX shell 上。


不错,但告诉我什么是外文字符? ;) - sjsam
我的意思是这些字符:āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ - Binaromong
我还没有方法使其工作,但这可能会给你一些提示:当回显/连接文件时,这些字符由不同的字节集表示,而与ls/bash全局扩展相比,似乎它不起作用。 echo -n 'Ã' | hexdump -C 将给你 c3 83,当在目录中ls命名为Ãa的两个文件时,无论什么原因,Ã将给你41 cc 83。希望能有所帮助。 - Pavel Gurkov
2
@PavelGurkov:这是因为在HFS+中,文件名存储在NFD中:https://developer.apple.com/library/mac/qa/qa1235/_index.html - ninjalj
这可能会有效地删除您的一些文件。如果您有一个名为a的文件和另一个名为á的文件,那么您的a文件将被覆盖。 - bdsl
显示剩余2条评论
1个回答

2
这应该可以解决问题:
for f in *.txt; do
    newf=$(echo $f | iconv -f utf-8-mac -t utf-8 | sed 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/')
    mv $f $newf
done

iconv -f utf-8-mac -t utf-8命令将文本从utf-8-mac转换为utf-8,这解决了@PavelGurkov和@ninjalj在评论中讨论的预组合/分解问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接