用UNIX Bash脚本替换文件名中英文等价的外来字符

时间:2016-05-18 15:47:22

标签: bash macos shell unix sed

我正在尝试使用sed处理文件名列表,并用英语等同替换文件名中的每个外来字符。例如。

málaga.txt - > malaga.txt

我的脚本如下:

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

目前这对文件名没有影响。但是,如果我使用相同的正则表达式来处理文本文件。 E.g。

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

它完美地运作 - 所有外国字符都用它们的英语等价物代替。任何帮助将不胜感激。这是在UNIX shell中的Mac OsX上。

1 个答案:

答案 0 :(得分:1)

这应该这样做:

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在评论中讨论的预组合/分解问题。