Я использую следующую команду для определения диапазона набора символов для шестнадцатеричного кода от 0900 (вместо अ) до 097F (вместо व). Как я могу использовать шестнадцатеричный код вместо अ и व?
bzcat archive.bz2 | grep -v '<[अ-व]*\s' | tr '[:punct:][:blank:][:digit:]' '\n' | uniq | grep -o '^[अ-व]*$' | sort -f | uniq -c | sort -nr | head -50000 | awk '{print "<w f=\""$1"\">"$2"</w>"}' > hindi.xml
Я получаю следующий вывод:
<w f="399651">और</w>
<w f="264423">एक</w>
<w f="213707">पर</w>
<w f="74728">कर</w>
<w f="44281">तक</w>
<w f="35125">कई</w>
<w f="26628">द</w>
<w f="23981">इन</w>
<w f="22861">जब</w>
...
Я просто хочу использовать шестнадцатеричный код вместо अ и व в приведенной выше команде.
Если использование шестнадцатеричного кода вообще невозможно, могу ли я использовать юникод вместо шестнадцатеричного кода для набора символов ('अ-व')?
Я использую Ubuntu 10.04
shell
grep
character-encoding
unicode
Друбо Бхаттачарджи
источник
источник
-v
инвертирует совпадение, из текста вашего вопроса кажется, что это не то, что вы хотите.Ответы:
Посмотри на этот вопрос .
Текст обычно кодируется в UTF-8; поэтому вы должны использовать шестнадцатеричные значения байтов, используемые в кодировке utf-8.
а также
эквивалентны, и они выполняют сопоставление на основе локали (то есть сопоставление зависит от правил сортировки сценария devanagari (то есть сопоставление НЕ "любой символ между \ u0905 и \ 0935", а вместо этого "что-либо сортирующее между devanagari А и деванагари В.А. "; возможны различия.
С другой стороны, у вас есть это (примечание -P):
это сделает двоичное соответствие с этими байтовыми значениями.
источник
"["$'
и суффикс"]"
Если экранирования достаточно, вы можете использовать следующий
$'\xHH'
синтаксис:Этого достаточно для вашего варианта использования?
источник
echo 'अ-व' | hd
дает мнеe0 a4 85 - e0 a4 b5
grep
как он не связан с какой-либо библиотекой, я думаю, что преобразование диапазона не может быть выполнено grep: - /zsh
может интерпретировать"\u0900"
и"\u097F"
, но поведение будет зависеть от непрерывности кодированного диапазона UTF-8 (вероятно, так оно и есть).Введенное
0x0900
вами шестнадцатеричное значение является в точности значением кодовой точки UNICODE, которая также находится в шестнадцатеричном формате.Я считаю , что то , что вы хотите сказать , является шестнадцатеричной точкой UNICODE кода:
U0905
.Характер у U-0900 не один вы использовали:
अ
.Этот символ - U0905 , часть этой страницы Unicode или указанный на этой странице .
В
bash
(установленном по умолчанию в Ubuntu) или непосредственно с программой по адресу:/usr/bin/printf
(но не сsh
printf) символ Unicode может быть получен с:Однако этот символ, который приходит из номера кодовой точки, может быть представлен несколькими потоками байтов в зависимости от того, какая кодовая страница используется.
Должно быть очевидно, что
\U0905
это0x09 0x05
в UTF-16 (UCS-2 и т. Д.)И
0x00 0x00 0x09 0x05
в UTF-32.Это может быть неочевидно, но в utf-8 оно представлено
0xe0 0xa4 0x85
:Если локаль вашей консоли похожа на
en_US.UTF-8
.И я говорю о оболочке, потому что именно она преобразует строку в то, что получает приложение. Это:
заставляет grep "видеть" персонажа, который вам нужен.
Чтобы понять строку выше, вы можете использовать echo:
Затем мы можем построить диапазон символов, как вы просите:
Это ответ на ваш вопрос:
источник
мы хотели преобразовать открытые двойные кавычки без ascii и двойные кавычки в обычные двойные кавычки ("). Также одинарные кавычки без ascii в обычные одинарные кавычки (')
чтобы увидеть их в файле (оболочка Ubuntu Bash):
переведите их:
источник