转换bash shell脚本中的特殊字符

时间:2010-09-01 09:11:55

标签: bash shell

如何编写bash shell脚本(在Mac OS X下)以转换具有特殊字符(如ä,ö,ü)的各种文件的名称?使用sed不起作用:

echo * | sed s/ü/ue/

我能以其他方式做到吗?

修改

这是完整的脚本。它基本上拉上了iPhone应用程序包,然后(应该)转换zip文件名中的任何特殊字符:

#/bin/bash

for appfile in *.app
do
    zipfile=`echo ${appfile} | sed s/app/zip/`
    zipfile=`echo ${zipfile} | sed s/\ /_/`
    # these don't work...
    zipfile=`echo ${zipfile} | sed s/ä/ae/`
    zipfile=`echo ${zipfile} | sed s/ö/oe/`
    zipfile=`echo ${zipfile} | sed s/ü/ue/`
    zipfile=`echo ${zipfile} | sed s/ß/ss/`
    # make zip
    zip -ruy0 "${zipfile}" "${appfile}"
done

修改

得到了!!诀窍是通过iconv运行文件名来转换编码。我在做äöü替换之前做到了这一点并且有效:

zipfile=`echo ${zipfile} | iconv -f utf-8-mac -t utf-8`

1 个答案:

答案 0 :(得分:1)

您可能需要使用sed /s/ü/ue/g(请注意g全球替换,因此它会替换所有出现次数,而不仅仅是第一次出现次数。

您是否尝试重命名文件?或者只是更改文件名的输出结果?

修改

试试这个脚本:

#/bin/bash

for appfile in *.app
do
    zipfile=`echo ${appfile} | sed s/app$/zip/`
    zipfile=`echo ${zipfile} | sed s/\ /_/g`
    # these don't work...
    zipfile=`echo ${zipfile} | sed s/ä/ae/g`
    zipfile=`echo ${zipfile} | sed s/ö/oe/g`
    zipfile=`echo ${zipfile} | sed s/ü/ue/g`
    zipfile=`echo ${zipfile} | sed s/ß/ss/g`
    # make zip
    echo zip -ruy0 "${zipfile}" "${appfile}"
done

当我用两个简单的文件名运行它时,它给出了这样的输出:

$ ./foo.sh
zip -ruy0 ae_oeoe_ue_ss.zip ä  öö ü ß.app
zip -ruy0 ueueueueue.zip üüüüü.app

文件名为ä öö ü ß.appüüüüü.app

我刚刚在所有g命令的末尾放置了sed,并锚定了app。 (当你有一个名为appliance.appdeliciousapple.app的人时会很好。)最后echo对于测试很方便。 :)

有一些我不明白的事情:如果你的文件名在iso-8859-1语言环境中有特殊字符(对于ß的字节0xDF),你的命令行是UTF-8(字节{{1 }}), 怎么了?反过来怎么样?