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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Проблемы с киррилицей в Regexp  (Прочитано 746 раз)

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

Оффлайн neman2024

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Проблемы с киррилицей в Regexp
« : 17 Октября 2024, 18:59:26 »
Господа, и всё-таки не могу понять следующие вещи, которые никак не хотят стыковаться с различными манами:
Я просто понять не могу - это я везде косячу, или же никто до меня не обращал внимания?
1. я уже писал в прошлом сообщении про некорректную работу gpep с регистрозависимыми шрифтами в кириллице:
если использовать выражения типа:
grep -E '[А-Я]' com.lsПолучаем результат:
ФР_КАБ_реквизиты.zip
ФР_КАБ_печать.png
ФР_КАБ_ВТБ_РС.pdf
т.е., несмотря на то, что в диапазоне указаны только большие заглавные буквы, в выдаче у нас попадают все, и заглавные, и строчные - за исключением строчной буквы "а", здесь я привел только несколько примеров, а вообще она нигде не попала в выборку.
Если же мы указываем не кириллицу, а латиницу, все отрабатывается корректно: указали в диапазоне строчные - в выдаче тоже получили строчные.
Посоветовали изменить параметр с -Е на -Р:
grep -Р '[А-Я]' com.lsвыдача:
ФР_КАБ_реквизиты.zip
ФР_КАБ.PNG
ФР_КАБ_ВТБ_РС.PDF
Я уже обрадовался, но сегодня образовалась новая беда:
grep -P "\w+\.pdf" com.lsСчет_Петрович_№ ТШЭ020487543_202409019.PDF
Счет_Петрович_№_ТСЭ00047593_20240928.PDF
Счет_Петрович_ № ТСЭ0083920_20240910.PDF
Договор_интернет_20240829.pdf
т.е. с оператором -P исчезал ошибка с регистром, но при использовании в комбинации с /w он вообще перестал видеть кириллицу, только цифры, хотя должен был и то, и то

Если же мы заменим его обратно на глючный -Е, который упорно не хотел учитывать регистр, то в сочетании с /w получится, что он опять прекрасно видит кириллические шрифты:
grep -E "\w+\.pdf" com.lsПриход_расход_ФР_КАБ.xlsx
Договор_интернет_20240829.pdf
Рамочный_договор_Техн_Каб_20240818.rtf

Я уже устал от этой непредсказуемости поведения команд, причем с английскими шрифтами все работает, как положено...
А забить на использование русских шрифтов и все названия файлов переводить на аглийский - ну такой себе выход....
« Последнее редактирование: 18 Октября 2024, 08:15:56 от neman2024 »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7820
  • We were here
    • Просмотр профиля
Re: Проблемы с киррилицей в Regexp
« Ответ #1 : 17 Октября 2024, 20:11:25 »
Вот еще варианты
grep -E "[[:upper:]]\.pdf" com.ls
grep -E "[[:lower:]]\.pdf" com.ls
grep -E "[[:alnum:]]\.pdf" com.ls

Character-Classes-and-Bracket-Expressions
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн neman2024

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Проблемы с киррилицей в Regexp
« Ответ #2 : 18 Октября 2024, 07:53:18 »
Добрый день
Спасибо за ответ. Собственно, с POSIX и начинал изучение, только потом перешел к "сокращенным" вариантам для удобства.
Помогите разобраться, у меня остановилось изучение регулярок. Когда отрабатываю на тренажерах (https://regexone.com) - все работает как часы, как только перехожу в Ubuntu - большая часть не хочет работать.
Вот смотрите, что получается. Создал ls2.com с именами файлов. Пробую различные варианты, которые должны работать:
1. grep -E "[А-Я]" ls2.comroot@server2:/home/dimi# grep -E "[А-Я]" ls2.com
./анекдот.txt
./анекдот.xyz
./анекдот2.xyz
./анекдоти.kri
./ФЛ_МФА.txt
./АНЕКдот.txt
./неко_303432.txt
./анекдоте.xyz
./анекдоте3.xyz
./анекдоте.txt
Т.е. полностью игнорируется наличие регистра в киррилице. И маленькая "а" в выборку тоже не попадает.
Меняю ключ на -Р, как Вы и посоветовали:

2. grep -P "[А-Я]" ls2.comroot@server2:/home/dimi# grep -P "[А-Я]" ls2.com
./ФЛ_МФА.txt
./АНЕКдот.txt
С этим оператором все заработало корректно.
Пробую с этим ключом поствить метасимвол \w (на regexone.com обкатывал много раз - все работает):(

3. grep -P "\w+\..{3}" ls2.com
root@server2:/home/dimi# grep -P "\w+\..{3}" ls2.com
./mysoft.txt
./222.txt
./panels.ini
./Prov10.txt
./Pli.txt
./анекдот2.xyz
./file.txt
./123.txt
./ls2.com
./color.txt
./priba_e32454543.txt
./Pro_GS.txt
./неко_303432.txt
./Prov10.txt
./proverka.txt
./анекдоте3.xyz
./Eli.txt
./321.txt
./known_hosts.old
./235.txt
Оказывается, он с оператором -Р вообще не видит кириллицу!!!
И файлы, у которых имена состояли (до расширения) только из русских букв, вообще в выборку не попали!
Меняю оператор обратно на -Е:

4. grep -E "\w+\..{3}" ls2.com
root@server2:/home/dimi# grep -E "\w+\..{3}" ls2.com
./mysoft.txt
./222.txt
./panels.ini
./анекдот.txt
./Prov10.txt
./анекдот.xyz
./Pli.txt
./анекдот2.xyz
./file.txt
./123.txt
./ls2.com
./color.txt
./анекдоти.kri
./ФЛ_МФА.txt
./priba_e32454543.txt
./АНЕКдот.txt
./Pro_GS.txt
./неко_303432.txt
./Prov10.txt
./proverka.txt
./анекдоте.xyz
./анекдоте3.xyz
./Eli.txt
./321.txt
./анекдоте.txt
./known_hosts.old
./235.txt
С этим ключом он опять начал видеть русские шрифты, в выборку попали уже все файлы, но с этим оператором регулярному выражению пофиг на регистр в русских шрифтах (с этого и начались раньше первые вопросы)
Пробую применить "классическую" замену \w
5. root@server2:/home/dimi# grep -E "[[:alnum:]]+[[:upper:]]\..{3}" ls2.com
./ФЛ_МФА.txt
./Pro_GS.txt

[[:word:]] - система вообще не распознала....

Как по минному полю - это работает, это не работает...
На какой системе символов в Ubunta остановиться, чтобы регулярки корректно работали? Потому что если бы совершенно случайно не выявил некооректную работу -Е и -Р с регистрами русских шрифтов, а в комбинации с \w - вообще неспособность видеть русские шрифты, так бы и мучился дальше...

P.S. Кстати, а вот работа символьных классов:
grep -E "[[:alnum:]][[:upper:]]" ls2.com
./ФЛ_МФА.txt
./АНЕКдот.txt
./Pro_GS.txt
Большие "А" и "Р" - команда не увидела, какие тут вообще закономерности????!
« Последнее редактирование: 18 Октября 2024, 08:49:34 от neman2024 »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7820
  • We were here
    • Просмотр профиля
Re: Проблемы с киррилицей в Regexp
« Ответ #3 : 18 Октября 2024, 09:22:10 »
Большие "А" и "Р" - команда не увидела, какие тут вообще закономерности????!
Что-то мне подсказывает, что у вас с локалью не все в порядке.
printenv
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

 

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