Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Регулярные выражения с кирилицей в perl: скрипт сопротивляется.  (Прочитано 5049 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн pam123

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Здравствуйте,

Не уверен, что правильно выбрал место для вопроса. Если что, пожалуйста перенесите.

Суть:
В Perle и Shell ноль, но пытаюсь написать скрипт.
#!/bin/bash
cd /home/111/websites/web
for i in `find /home/111/websites/web|grep .html`
do
perl -pi -e 's|index\.html|http\:\/\/www\.mysite\.ru|g' $i
perl -pi -e 's|Главная|Главная\, и очень важная|' $i
perl -pi -e 's|Шило|Мыло|' $i
perl -pi -e 's|utf\-8|windows\-1251|g' $i
iconv -f utf-8 -t windows-1251 "$i" >tmp
mv tmp "$i"
done

Все работает как надо кроме строк
perl -pi -e 's|Главная|Главная\, и очень важная|' $i
perl -pi -e 's|Шило|Мыло|' $i
как я понял из поисков по сети - проблема с кириллицей, однако как решить найти не могу. Все облазил. Может ищу не в "ту" сторону.
Пробовал в началет скрипта добавить строки:
#!/bin/bash
perl use locale
perl use POSIX qw(setlocale LC_ALL LC_CTYPE)
perl setlocale(LC_CTYPE, "ru_RU.utf8")

однако сервер сказал что это бред.

Вопрос Знатокам:
Как заставить работать замену с кириллицей в рамках Shell скрипта?
Или может я иду неверным путем?
Тогда второй вопрос Знатокам:
Как Shell скриптом заменить во всех файлах html строковые вхождения в тч с кириллицей и спецсимволами (типа "<title>Главная<\title>")?

Заранее спасибо.

С уважением,
Павел

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Cтоит все написать на bash или на perl. Если bash, то замена текста в файле осуществляется с помощью команды sed.
sed -i 's/Шило/Мыло/' $i
Про локаль в перле написано очень много, поиск по словам perl locale даст результат. Если кратко, то для каждой текстовой строки он держит флаг, показывающий ему, она в unicode или нет.

http://xpoint.ru/know-how/Perl/PodderzhkaUnicode

Цитировать
Пробовал в началет скрипта добавить строки:
#!/bin/bash
perl use locale
perl use POSIX qw(setlocale LC_ALL LC_CTYPE)
perl setlocale(LC_CTYPE, "ru_RU.utf8")
Это неправильно.
Интерпретатор perl вызывается каждый раз заново, и не помнит настроек из предыдущего вызова.
Если требуется написать все на перле, то надо все делать в одном скрипте.
Как-то так:

#!/usr/bin/perl -w
use locale;
use POSIX qw(setlocale LC_ALL LC_CTYPE);
setlocale(LC_CTYPE, "ru_RU.utf8");

и т.д.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн pam123

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
wl

Спасибо за совет и направление поиска.

Попробовал sed, но все равно замена не производится.
Ума не приложу как поймать что не так. :(
То ли локаль, то ли что-то иное.

Посоветуйте пожалуйста где почитать sed+локаль?

С уважением,
Павел

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Все работает.

$ cat b.txt
Шило
Мыло

$ sed -i 's/Шило/Мыло/' b.txt

$ cat b.txt
Мыло
Мыло


Файл b.txt был в UTF-8

А про sed и локаль читают все там же - в гугле.
« Последнее редактирование: 16 Июля 2009, 20:24:17 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн pam123

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
wl
спасибо за указанный вектор мысли.
если честно, про sed + локаль когда писАл, думал как "обычно" матом ответят. попробую порыться, хотя потому и спросил, что первичная пробежка по поисковикам существенных результатов не дала.

Теперь по существу.
все работает "вручную", но в скрипте - нет.
Может ли быть такое, что мои конструкции (цикл с grep и sed) не справляются из-за того, что в файле нагромождение из ковычек и скобок типа html?

Ума не приложу как дальше отлаживать...

Пользователь решил продолжить мысль 22 Июля 2009, 09:09:50:
2all

плиз, кто-нить попробуйте у себя на системе (ОС) работают ли оба варианта
$ sed -i 's/Шило/Мыло/' b.txt
_и_ в ручном терминале _и_ в скрипте?

Может у меня что-то не так с настройками самой системы?
« Последнее редактирование: 22 Июля 2009, 09:09:50 от pam123 »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Ума не приложу как дальше отлаживать...

плиз, кто-нить попробуйте у себя на системе (ОС) работают ли оба варианта
$ sed -i 's/Шило/Мыло/' b.txt
_и_ в ручном терминале _и_ в скрипте?

Может у меня что-то не так с настройками самой системы?


У файла со скриптом кодировка какая?
А у b.txt?

С кодировками в sed мне все представляется довольно просто - они наследуются от родительского процесса.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн pam123

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Воистину люди спотыкаются не об горы, а об камни.

Проблема была под ногами.

cat myscript.shвыдало глюки на том месте, где должен был быть кириллический текст.

Сделал следующее:
создал новый myscript2.sh "с нуля" с помощью vi (а не с помощью gedit, как раньше) .
Все перенабрал заново.
Заработало.

Моя ошибка была в том, что проверяя кодировку скрипта и кстового файла я просто смотрел скрипт в gedit.
Всё читалось, думал это и есть utf-8 - ведь 
iconv -f utf-8 -t windows-1251 myscript.sh
iconv -f utf-8 -t windows-1251 b.txt

работало правильно.
При этом создавал b.txt как
echo шило > b.txt
Спсибо wl за пинки в нужную сторону.

Осталось два вопроса.
1. Как так может быть что создавая новый файл в gedit "получается" кодировка _не_ utf-8 (а какая?)? Вед системно, как я понимаю, стоит utf-8.
2. Как правильно смотреть в какой кодировке файл, если gedit показывает его корректно, а cat - глюки?

С уважением,
Павел

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Про gedit ничего не знаю и не нашел, где у него задаются кодировки.
Возможно, гугль и поиск по словам "gedit default encoding" помогут.

В Kate, kwrite и в крусадеровском встроенном редакторах все кодировки задаются явно.

По поводу определения кодировки - поиск по словам "detect encoding" дал enca а также питоний модуль.

Вообще, есть алгоритм, даже, наверное, не один - надо поискать, в чем он реализован.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

 

Страница сгенерирована за 0.021 секунд. Запросов: 21.