2010-09-01 47 views
2

如何編寫bash shell腳本(在Mac OS X中)以將特殊字符(如ä,ö,ü)轉換爲各種文件的名稱?使用sed不起作用:在bash shell腳本中轉​​換特殊字符

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運行文件名來轉換編碼。我做這個做AOU替換之前,它的工作:

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

在循環中產生'sed'幾次可能會很昂貴。你可以結合你的替換:'sed's /ä/ ae/g; S/O/OE /; ...「'。另外,Bash可以像這樣做:'zipfile = $ {zipfile //ä/ ae /}'(但它們必須單獨完成)。 – 2010-09-01 15:36:48

+0

感謝您的提示,儘管在這種情況下,性能並不是真正的問題。但無論如何,這很好。 – ian 2010-09-02 07:26:41

回答

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

我剛剛在sed命令的末尾放置了一個g,並且鎖定了app。 (當你有一個名字爲appliance.appdeliciousapple.app時,這會很好。)最後的echo便於測試。 :)

有一些我不明白:如果您的文件名在iso-8859-1語言環境中有特殊字符(ß爲字節0xDF),而您的命令行是UTF-8(字節0xC3 0x9F),那麼發生?反過來呢?

+0

基本上我正在壓縮各種文件(單獨),我想替換zip(不是原始文件)名稱中的特殊字符。 – ian 2010-09-01 09:39:57

+0

顯然,在Mac OS X中,文件名中的特殊字符以「分解形式」存儲,意味着ä被存儲爲「a」+「組合視頻」(U + 0308)。任何想法我能如何匹配...? – ian 2010-09-01 10:35:53

+0

Woah,我還不知道OS X存儲(或生成?)文件名與我預期的不同。你可以使用'sed s/\ x61 \ x03 \ x08/ae/g'等等嗎? – sarnold 2010-09-01 11:01:48

相關問題