Как указать символы с помощью шестнадцатеричных кодов в 'grep'?

AltO открывает каталог, Ваш курсор идет.

AltI открывает каталог активной панели на другой панели.

Протестированный на MC 4.7

27
27.11.2016, 16:44
4 ответа

Если выход оболочки достаточно, можно использовать $'\xHH' синтаксис как это:

grep -v "<["$'\x09\x00'"-"$'\x09\x7F'"]*\s"

Это достаточно для Вашего варианта использования?

6
27.01.2020, 19:39
  • 1
    echo 'अ-व' | hd дает мне e0 a4 85 - e0 a4 b5 –  enzotib 26.08.2011, 17:30
  • 2
    Действительно OP дал значения unicode, не шестнадцатеричные дампы в кодировке UTF-8 :-/ С тех пор grep не связан ни с каким lib, я предполагаю, что не возможно иметь преобразование диапазона быть выполненным grep :-/ –  Stéphane Gimenez 26.08.2011, 17:48
  • 3
    Btw, zsh может интерпретировать "\u0900" и "\u097F", но поведение будет полагаться на UTF-8 закодированный диапазон, являющийся непрерывным (вероятно, это). –  Stéphane Gimenez 26.08.2011, 17:49
  • 4
    Никакой grep-v" <[" $ '\x09\x00'" - "$ '\x09\x7F'"] *\s" не дает следующий вывод <w f = "16929"> x </w> <w f = "10995"> F </w> <w f = "2548"> FF </w> <w f = "762"> FFFFFF </w> <w f = "655"> FFFF </w> <w f = "266"> xx </w> <w f = "215"> FFF </w> <w f = "117"> xxx </w>.... Это не ожидается. :(, я могу использовать unicode вместо шестнадцатеричного кодового набора или набора символов (' अ - व ')? –  Dhrubo Bhattacharjee 28.08.2011, 05:54

Посмотрите на этот вопрос.

Текст обычно кодируется в UTF-8; таким образом, необходимо использовать шестнадцатеричные долины байтов, используемых в кодировании utf-8.

grep "["$'\xe0\xa4\x85'"-"$'\xe0\xa4\xb5'"]"

и

grep '[अ-व]'

эквивалентны, и они выполняют основанное на локали соответствие (то есть, соответствие зависит от правил сортировки сценария деванагари (то есть, соответствие НЕ является "никаким символом между \u0905 и \0935", но вместо этого "ничто сортирующее между деванагари A и деванагари ВА"; могут быть различия.

С другой стороны, у Вас есть это (отметьте-P):

grep -P "\xe0\xa4[\x85-\xb5]"

это сделает двоичное соответствие тем значениям байта.

21
27.01.2020, 19:39
  • 1
    Объясните префикс "["$' и суффикс "]" –  Jonathan Komar 23.03.2017, 11:36

мы хотели преобразовать неASCII открытая двойная кавычка и закрыть двойную кавычку к регулярным двойным кавычкам ("). Также одинарная кавычка неASCII к регулярной одинарной кавычке (').

видеть их в файле (оболочка удара человечности):

$ grep -P "\x92" infile.txt  (single)
$ grep -P "\x93" infile.txt  (open double)
$ grep -P "\x94" infile.txt  (close double)

переведите их:

$ /bin/sed "s/\x92/'/g" a.txt > b.txt
$ /bin/sed 's/\x93/"/g' b.txt > c.txt
$ /bin/sed 's/\x94/"/g' c.txt > d.txt
2
27.01.2020, 19:39

"Шестнадцатеричное" значение 0x0900 , которое вы написали, является в точности значением кодовой точки UNICODE, которая также находится в шестнадцатеричном формате.

шестнадцатеричный код 0900 (вместо अ)

Я считаю, что вы имеете в виду шестнадцатеричный код UNICODE: U0905 .

Персонаж в U-0900 не тот, который вы использовали: .
Этот символ - U0905 , часть этой страницы Unicode или перечисленный на этой странице .

В bash (установлен по умолчанию в Ubuntu) или непосредственно с программой по адресу: / usr / bin / printf (но не с sh printf ), символ Unicode может быть создан с помощью:

$ printf '\u0905'
अ
$ /usr/bin/printf '\u0905'
अ

Однако этот символ, который происходит из номера кодовой точки, может быть представлен несколькими потоками байтов в зависимости от того, какая кодовая страница используется.
Должно быть очевидно, что \ U0905 - это 0x09 0x05 в UTF-16 (UCS-2 и т. Д.)
и 0x00 0x00 0x09 0x05 в UTF-32.
Это может быть неочевидно, но в utf-8 это представлено как 0xe0 0xa4 0x85 :

$ /usr/bin/printf '\u0905' | od -vAn -tx1
e0 a4 85

Если локаль вашей консоли похожа на en_US. UTF-8 .

И я говорю о оболочке, потому что она преобразует строку в то, что получает приложение. Это:

grep "$(printf '\u0905')" file

заставляет grep «видеть» нужный вам символ.
Чтобы понять строку выше, вы можете использовать echo:

$ echo grep "$(printf '\u0905')" file
grep अ file

Затем мы можем построить диапазон символов по вашему запросу:

$ echo grep "$(printf '[\u0905-\u097f]')" file
grep [अ-ॿ] file

Это ответ на ваш вопрос:

Как я могу использовать шестнадцатеричный код вместо अ и व?

6
27.01.2020, 19:39

Теги

Похожие вопросы