LINUX.ORG.RU

Русские буковки


0

1

Поможите, люди добрые!

В общем, нужно либо выделить из текстового файла все строки, содержащие русские буковки.

Либо определить, содержит ли строка русские буковки.

Последнее, в принципе, предпочтительнее.

А так же, может быть, кто-нибудь знает утилитки (ну или алгоритмы), умеющие переводить какое-нибудь «Ghjcnj ntrcn nfrjq rhbdjq» в нормальный русский текст?

★★★★★

А в чем сложность? Вариант 1 (простейший): смотрим на старший бит — если единица, считаем русской буквой. Вариант 2 (посложней): проверяем каждый байт на соответствие таблице, в которой записаны русские буквы.

утилитки

enconv, iconv

Eddy_Em ☆☆☆☆☆
()

Кстати, для баша простая проверка:

ishtar> 12.02, 09:09 ~
echo "text witout cyrillic" | iconv -t KOI-7
  
ishtar> 12.02, 09:09 ~
echo "text with несколькими cyrillic буквами" | iconv -t KOI-7
  NESKOLXKIMI  BUKWAMI
В общем, думаю, ты понял, как просто реализовать в баше проверку на то, содержатся ли в тексте кириллические буквы.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от kostik87

Ух ты! Работает! Просто раньше (года 3-4 назад) grep по русским буквам (если вот так — диапазоном задать) не работал, т.к. буковки-то не по порядку в КОИ-8!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от kostik87

Клева! Спасибо большое за подсказку. :) К утру уже и не соображаю нифига. :)

slamd64 ★★★★★
() автор топика
Ответ на: комментарий от kostik87
grep -i [а-я]
grep: Неверный знак сортировки

что ты за ересь подсказываешь? Это говно только у Эдди взлетит, и то, даже у него оно будет косячить на Ё (т.к. Ё не входит в а-я даже в его KOI8-R).

Увы, надо так:

echo "гы"| grep -i '[абвгдеёжзийклмнопрстуфхцчшщьыъэюя]'
ибо utf-8 проще все выписать, чем искать метод получения одного из другого.

emulek
()
Ответ на: комментарий от Eddy_Em

enconv, iconv

Да вот ради них, родимых-то. Всю ночь воюю.

Смысл в том, что есть дамп в 300Мб некоей мускульной таблички, в которой по недоразумению русские строчки аж в 4-х кодировках. А многие, еще и dublicate-encoded.

enconv в ступоре и ничего не транслирует, только визжит на ошибки множественной дублированной перекодировки. iconv - вылетает с «illegal input sequence at position» - как раз на правильных UTF-8 строках.

Вот идея в том, чтобы вырезать все UTF-8 строки и iconv'ом сделать одну перекодировку.

После чего строки должны в большинстве стать русскими (их, опять же, вырезать можно) и далее либо еще разок iconv'ом пройтись, либо enconv заработает нормально.

slamd64 ★★★★★
() автор топика
Ответ на: комментарий от emulek

что ты за ересь подсказываешь? Это говно только у Эдди взлетит, и то, даже у него оно будет косячить на Ё (т.к. Ё не входит в а-я даже в его KOI8-R).

echo -e "абвгд\nabcdef\nё" | grep -i [а-я]
абвгд
ё

kostik87 ★★★★★
()
Ответ на: комментарий от emulek

Это уже детали. :) Главное, что такая возможность есть и не придется кодить на Си это щасте.

slamd64 ★★★★★
() автор топика
Ответ на: комментарий от kostik87

ё

это ничего не доказывает. Не факт, что оно не пропустит ☃ или ещё один из 100500 допустимых символов.

Ну и в Slackware не работает, а значит — ты написал говно.

emulek
()
Ответ на: комментарий от emulek

Какая версия grep в твоём slackware ?

Вот видео: http://youtu.be/pbQvj3gsymQ

Ну а то, что у тебя не работает что-то в Slackware так это связано с твоими руками. Не буду плохо говорить о дистрибутиве в целом.

Ну и укороти свой язычок, тебя уже раз забанили.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 2)
Ответ на: комментарий от kostik87

Зато (по-крайней на древнем knoppix-е) украинское «і» ловит. (Там в collate копируют iso14651_t1, где cyrillic общий).

anonymous
()
Ответ на: комментарий от x3al

Смотрим тему, читаем, думаем, догадываемся, что русский алфавит _строгое подмножество_ {Cyrillic}.

anonymous
()
Ответ на: комментарий от emulek

А вот хрен тебе!

echo -e "а\na\nб\nb\nе\nr\nЁ\nx\nё\nm\n"|  grep -i [а-и]
а
б
е
Ё
ё
echo -e "а\na\nб\nb\nе\nr\nЁ\nx\nё\nm\n"|  grep -i [а-е]
а
б
е
echo -e "а\na\nб\nb\nе\nr\nЁ\nx\nё\nm\nА\nБ\nГ\nЖ\n"|  grep -i [а-е]
а
б
е
А
Б
Г
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от kostik87

Какая версия grep в твоём slackware ?

2.14

Ну а то, что у тебя не работает что-то в Slackware так это связано с твоими руками. Не буду плохо говорить о дистрибутиве в целом.

УМВР

Ну и укороти свой язычок, тебя уже раз забанили.

обиделся?

emulek
()
Ответ на: комментарий от emulek

в Slackware не работает

Работает.

$ echo abcабвгдеёжзийклмнопрстуфхцчшщъыьэюяxyz | grep -o '[а-я]*'
абвгдеёжзийклмнопрстуфхцчшщъыьэюя

$ cat /etc/*version; echo $LANG
Slackware 14.1
ru_RU.utf8

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от emulek

Дык, починили — это замечательно! И сортировка работает...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

А у меня лишней нет:

chartable 

 32 -  	 64 - @	 96 - `	128 - ─	160 - ═	192 - ю	224 - Ю	
 33 - !	 65 - A	 97 - a	129 - │	161 - ║	193 - а	225 - А	
 34 - "	 66 - B	 98 - b	130 - ┌	162 - ╒	194 - б	226 - Б	
 35 - #	 67 - C	 99 - c	131 - ┐	163 - ё	195 - ц	227 - Ц	
 36 - $	 68 - D	100 - d	132 - └	164 - ╓	196 - д	228 - Д	
 37 - %	 69 - E	101 - e	133 - ┘	165 - ╔	197 - е	229 - Е	
 38 - &	 70 - F	102 - f	134 - ├	166 - ╕	198 - ф	230 - Ф	
 39 - '	 71 - G	103 - g	135 - ┤	167 - ╖	199 - г	231 - Г	
 40 - (	 72 - H	104 - h	136 - ┬	168 - ╗	200 - х	232 - Х	
 41 - )	 73 - I	105 - i	137 - ┴	169 - ╘	201 - и	233 - И	
 42 - *	 74 - J	106 - j	138 - ┼	170 - ╙	202 - й	234 - Й	
 43 - +	 75 - K	107 - k	139 - ▀	171 - ╚	203 - к	235 - К	
 44 - ,	 76 - L	108 - l	140 - ▄	172 - ╛	204 - л	236 - Л	
 45 - -	 77 - M	109 - m	141 - █	173 - ╜	205 - м	237 - М	
 46 - .	 78 - N	110 - n	142 - ▌	174 - ╝	206 - н	238 - Н	
 47 - /	 79 - O	111 - o	143 - ▐	175 - ╞	207 - о	239 - О	
 48 - 0	 80 - P	112 - p	144 - ░	176 - ╟	208 - п	240 - П	
 49 - 1	 81 - Q	113 - q	145 - ▒	177 - ╠	209 - я	241 - Я	
 50 - 2	 82 - R	114 - r	146 - ▓	178 - ╡	210 - р	242 - Р	
 51 - 3	 83 - S	115 - s	147 - ⌠	179 - Ё	211 - с	243 - С	
 52 - 4	 84 - T	116 - t	148 - ■	180 - ╢	212 - т	244 - Т	
 53 - 5	 85 - U	117 - u	149 - ∙	181 - ╣	213 - у	245 - У	
 54 - 6	 86 - V	118 - v	150 - √	182 - ╤	214 - ж	246 - Ж	
 55 - 7	 87 - W	119 - w	151 - ≈	183 - ╥	215 - в	247 - В	
 56 - 8	 88 - X	120 - x	152 - ≤	184 - ╦	216 - ь	248 - Ь	
 57 - 9	 89 - Y	121 - y	153 - ≥	185 - ╧	217 - ы	249 - Ы	
 58 - :	 90 - Z	122 - z	154 -  	186 - ╨	218 - з	250 - З	
 59 - ;	 91 - [	123 - {	155 - ⌡	187 - ╩	219 - ш	251 - Ш	
 60 - <	 92 - \	124 - |	156 - °	188 - ╪	220 - э	252 - Э	
 61 - =	 93 - ]	125 - }	157 - ²	189 - ╫	221 - щ	253 - Щ	
 62 - >	 94 - ^	126 - ~	158 - ·	190 - ╬	222 - ч	254 - Ч	
 63 - ?	 95 - _	127 - 	159 - ÷	191 - ©	223 - ъ	255 - Ъ	
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous
echo -e "а\na\nб\nb\nе\nr\nЁ\nx\nё\nm\nА\nБ\nГ\nЖ\n├\n▒\n⌡\nЪ\n"|  grep -i [а-е]
а
б
е
А
Б
Г
echo -e "а\na\nб\nb\nе\nr\nЁ\nx\nё\nm\nА\nБ\nГ\nЖ\n├\n▒\n⌡\nЪ\n"|  grep -i [а-я]
а
б
е
Ё
ё
А
Б
Г
Ж
Ъ
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от emulek

Ну и ССЗБ, что в юникоде этом сраном сидишь!

Eddy_Em ☆☆☆☆☆
()
#!/bin/bash

enc8bit=cp1251

alpha_en() {
  echo -n "qwertyuiopasdfghjklzxcvbnm" | iconv -f utf-8 -t $enc8bit
  echo -n "QWERTYUIOPASDFGHJKLZXCVBNM" | iconv -f utf-8 -t $enc8bit
}

alpha_ru() {
  echo -n "йцукенгшщзфывапролдячсмить" | iconv -f utf-8 -t $enc8bit
  echo -n "ЙЦУКЕНГШЩЗФЫВАПРОЛДЯЧСМИТЬ" | iconv -f utf-8 -t $enc8bit
}

echo "Ghjcnj ntrcn nfrjq rhbdjq" |
tr $(alpha_en) $(alpha_ru) |
iconv -f $enc8bit -t utf-8
anonymous
()
Ответ на: комментарий от emulek

LC_COLLATE=C, потому и не работает

Для пользовательских учёток предпочитаю родные настройки локали. root-у оставлены LANG=en_US.utf8 и LC_COLLATE=C, в том числе, чтобы не получать внезапные сбои порядка сортировки прежде всего в скриптах из a/pkgtools. В lang.sh что-то вроде

if [[ "$(id -u)" == "0" ]]; then
  export LANG=en_US.utf8
  export LC_COLLATE=C
else
  export LANG=ru_RU.utf8
  unset LC_COLLATE
fi
И волки сыты, и овцы целы ;-)

bormant ★★★★★
()
Ответ на: комментарий от bormant

И волки сыты, и овцы целы

волки как раз голодные, ибо такой говнокод на 146% серверов не прокатит. Только на уютном локалхосте, да и то лишь если ты не забыл lang.sh запустить. А потом будешь голову ломать как последний нуб: «почему это у меня скрипт работает, а в crontab — не взлетает??»

emulek
()
Ответ на: комментарий от emulek

если ты не забыл lang.sh запустить

Я то причём? Речь про /etc/profile.d/lang.sh, его /etc/profile запускает.

в crontab — не взлетает

Тут в первую очередь установку окружения проверяют, ибо в 80% дело в нём.

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)

А так же, может быть, кто-нибудь знает утилитки (ну или алгоритмы), умеющие переводить какое-нибудь «Ghjcnj ntrcn nfrjq rhbdjq» в нормальный русский текст?

Xneur советовали?

Либо определить, содержит ли строка русские буковки.

grep [а-я] file.txt например. Или если в скрипте посмотри ещё ключ grep -q, который позволяет использовать его как тест.

Ещё смотри help [[ — в двойных квадратных скобках баш умеет матчить строки регекспом.

Xenius ★★★★★
()
Ответ на: комментарий от bormant

Речь про /etc/profile.d/lang.sh, его /etc/profile запускает.

вот что там написано:

# One side effect of the newer locales is that the sort order is no longer according to ASCII values, so the sort order will change in many places. Since this isn't usually expected and can break scripts, we'll stick with traditional ASCII sorting. If you'd prefer the sort algorithm that goes with your $LANG setting, comment this out.

export LC_COLLATE=C

emulek
()
Ответ на: комментарий от bormant

Тут в первую очередь установку окружения проверяют, ибо в 80% дело в нём.

да, но лучше, когда скрипт работает в любом окружении.

emulek
()
Ответ на: комментарий от emulek

Я примерно показываю куда копать, а не пишу полностью готовое решение, так-то. Если ты не заметил, там даже ключа -i нет

Автор темы не указал, куда ему это надо, может ему на локалхост и портируемость не нужна?

А если портируемость нужна, то я вообще не советую использовать шелл, так как там слишком много подводных камней и этот — далеко не единственный.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 3)
Ответ на: комментарий от emulek

Since this isn't usually expected and can break scripts, we'll stick with traditional ASCII sorting.

Знаю. Оно там написано в первую очередь из-за pkgtools. Но этот момент уже исправлен, см. installpkg:

# Fri Apr 22 20:45:45 UTC 2011
# A stronger formula is needed to regularize output that will be parsed.
unset LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY \
  LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT \
  LC_IDENTIFICATION LC_ALL
LANG=C
export LANG
Хотя можно было обойтись и одним export LC_ALL=C, как это было сделано в removepkg.
Да и явно указывать переменные окружения никто не запрещает: LC_COLLATE=ru_RU.utf8 grep ....

bormant ★★★★★
()

А так же, может быть, кто-нибудь знает утилитки (ну или алгоритмы), умеющие переводить какое-нибудь «Ghjcnj ntrcn nfrjq rhbdjq» в нормальный русский текст?

http://saahriktu.org/downloads/eighth_finger_of_taiga_bear-0.2.1.xz

> echo "Ghjcnj ntrcn nfrjq rhbdjq" | ./eighth_finger_of_taiga_bear-0.2.1
Просто текст такой кривой
saahriktu ★★★★★
()
Ответ на: комментарий от Xenius

Автор темы не указал, куда ему это надо

не имеет значения. Я например скрипты с локалхоста в продакшен переношу, полностью и/или частично. А ты спецверсии пишешь, с комментарием «этот говнокод не годен для продакшена»? А почему в твоём посте такого коммента не было?

А если портируемость нужна, то я вообще не советую использовать шелл, так как там слишком много подводных камней и этот — далеко не единственный.

о да. А где по твоему нет подводных камней? Может в LISP'е нет, да? Или в сишечке? Или проще сразу вдоль сделать?

Не... Нужно ЯВНО указывать, что ты LC_COLLATE используешь нестандартное. И тогда всё будет хорошо. (если конечно glibc достаточно новая).

emulek
()
Ответ на: комментарий от bormant

Оно там написано в первую очередь из-за pkgtools.

на самом деле — не только. Эта ерунда меня часто выручала.

Но этот момент уже исправлен

это такие грабли, на которые в любой момент можно наступить.

Да и явно указывать переменные окружения никто не запрещает

можно конечно. А почему же ты не указал?

emulek
()

может быть, кто-нибудь знает утилитки (ну или алгоритмы), умеющие переводить какое-нибудь «Ghjcnj ntrcn nfrjq rhbdjq» в нормальный русский текст?

Наколенно:

$ E="QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>qwertyuiop[]asdfghjkl;'zxcvbnm,."
$ R="$(echo ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮйцукенгшщзхъфывапролджэячсмитьбю | iconv -t koi8-r)"
$ echo Ghjcnj ntrcn nfrjq rhbdjq | tr "$E" "$R" | iconv -f koi8-r
Просто текст такой кривой

bormant ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.