如何编写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`
答案 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.app
或deliciousapple.app
的人时会很好。)最后echo
对于测试很方便。 :)
有一些我不明白的事情:如果你的文件名在iso-8859-1语言环境中有特殊字符(对于ß的字节0xDF
),你的命令行是UTF-8(字节{{1 }}), 怎么了?反过来怎么样?