Преобразование специальных символов в сценарии оболочки bash - PullRequest
2 голосов
/ 01 сентября 2010

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

echo * | sed s/ü/ue/

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

EDIT

Вот полный сценарий. Он в основном архивирует пакеты приложений 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

EDIT

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

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

1 Ответ

1 голос
/ 01 сентября 2010

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

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

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), что просходит? Как насчет обратного?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...