2010-09-01 18 views
2

Как написать сценарий оболочки bash (в Mac OS X) для преобразования имен различных файлов со специальными символами, такими как ä, ö, ü? Использование sed не работает:Преобразование специальных символов в скрипт оболочки bash

echo * | sed s/ü/ue/ 

Могу ли я сделать это по-другому?

EDIT

Вот полный скрипт. Это в основном застегивает пакеты iPhone приложение, а затем (должны) конвертировать любые специальные символы в имени почтового индекса файла:

#/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 

EDIT

Понял !! Хитрость заключается в том, чтобы запустить имя файла через iconv для преобразования кодировки. Я сделал это, прежде чем делать замены äöü, и она работала:

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

Нерест 'sed' несколько раз в петле может быть дорогим. Вы можете комбинировать свои подстановки: 'sed 's/ä/ae/g; S/O/ае /; ... ''. Кроме того, Bash может сделать это следующим образом: 'zipfile = $ {zipfile // ä/ae /}' (но они должны выполняться индивидуально). –

+0

Спасибо за советы, хотя в этом случае производительность на самом деле не проблема. Но все равно хорошо знать. – ian

ответ

1

Вы, вероятно, нужно использовать sed /s/ü/ue/g (обратите внимание на g, глобальный заменить, поэтому он заменяет все вхождения, а не только первое вхождение).

Вы пытаетесь переименовать файлы? Или просто измените то, как выглядит имя файла для вывода?

EDIT

Попробуйте этот скрипт:

#/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 (байт 0xC3 0x9F), что происходит? Как насчет другого пути?

+0

В основном я застегиваю различные файлы (индивидуально), и я хочу заменить специальные символы в имени zip (а не на исходные файлы). – ian

+0

По-видимому, под Mac OS X специальные символы в именах файлов хранятся в «разложенной форме», а это означает, что «сохраняется» как «a» + «КОМБИНИРОВАННАЯ ОПЕРАЦИЯ» (U + 0308). Любая идея, как я мог бы соответствовать этому ...? – ian

+0

Woah, я не знал, что OS X хранит (или генерирует?) Имена файлов так иначе, как я ожидал. Не могли бы вы использовать 'sed s/\ x61 \ x03 \ x08/ae/g' и так далее? – sarnold

Смежные вопросы