Как преобразовать шестнадцатеричные символы в обычные символы?

Я попытался, но я застрял в «ускользании» от «sed»:

sed -i 's/\\x0/NUL/g' $1 sed -i 's/\\x1/SOH/g' $1 sed -i 's/\\x2/STX/g' $1 sed -i 's/\\x3/ETX/g' $1 sed -i 's/\\x4/EOT/g' $1 sed -i 's/\\x5/ENQ/g' $1 sed -i 's/\\x6/ACK/g' $1 sed -i 's/\\x7/BEL/g' $1 sed -i 's/\\x8/BS/g' $1 sed -i 's/\\x9/HT/g' $1 sed -i 's/\\x0A/LF/g' $1 sed -i 's/\\x0B/VT/g' $1 sed -i 's/\\x0C/FF/g' $1 sed -i 's/\\x0D/CR/g' $1 sed -i 's/\\x0E/SO/g' $1 sed -i 's/\\x0F/SI/g' $1 sed -i 's/\\x10/DLE/g' $1 sed -i 's/\\x11/DC1/g' $1 sed -i 's/\\x12/DC2/g' $1 sed -i 's/\\x13/DC3/g' $1 sed -i 's/\\x14/DC4/g' $1 sed -i 's/\\x15/NAK/g' $1 sed -i 's/\\x16/SYN/g' $1 sed -i 's/\\x17/ETB/g' $1 sed -i 's/\\x18/CAN/g' $1 sed -i 's/\\x19/EM/g' $1 sed -i 's/\\x1A/SUB/g' $1 sed -i 's/\\x1B/ESC/g' $1 sed -i 's/\\x1C/FS/g' $1 sed -i 's/\\x1D/GS/g' $1 sed -i 's/\\x1E/RS/g' $1 sed -i 's/\\x1F/US/g' $1 sed -i 's/\\x20//g' $1 sed -i 's/\\x21/!/g' $1 sed -i 's/\\x22/"/g' $1 sed -i 's/\\x23/#/g' $1 sed -i 's/\\x24/$/g' $1 sed -i 's/\\x25/%/g' $1 sed -i 's/\\x26/&/g' $1 sed -i 's/\\x27'/g' $1 sed -i 's/\\x28/(/g' $1 sed -i 's/\\x29/)/g' $1 sed -i 's/\\x2A/*/g' $1 sed -i 's/\\x2B/0/g' $1 sed -i 's/\\x2C/,/g' $1 sed -i 's/\\x2D/0/g' $1 sed -i 's/\\x2E/0/g' $1 sed -i 's/\\x2F///g' $1 sed -i 's/\\x30/0/g' $1 sed -i 's/\\x31/1/g' $1 sed -i 's/\\x32/2/g' $1 sed -i 's/\\x33/3/g' $1 sed -i 's/\\x34/4/g' $1 sed -i 's/\\x35/5/g' $1 sed -i 's/\\x36/6/g' $1 sed -i 's/\\x37/7/g' $1 sed -i 's/\\x38/8/g' $1 sed -i 's/\\x39/9/g' $1 sed -i 's/\\x3A/:/g' $1 sed -i 's/\\x3B/;/g' $1 sed -i 's/\\x3C/</g' $1 sed -i 's/\\x3D/=/g' $1 sed -i 's/\\x3E/>/g' $1 sed -i 's/\\x3F/?/g' $1 sed -i 's/\\x40/@/g' $1 sed -i 's/\\x41/A/g' $1 sed -i 's/\\x42/B/g' $1 sed -i 's/\\x43/C/g' $1 sed -i 's/\\x44/D/g' $1 sed -i 's/\\x45/E/g' $1 sed -i 's/\\x46/F/g' $1 sed -i 's/\\x47/G/g' $1 sed -i 's/\\x48/H/g' $1 sed -i 's/\\x49/I/g' $1 sed -i 's/\\x4A/J/g' $1 sed -i 's/\\x4B/K/g' $1 sed -i 's/\\x4C/L/g' $1 sed -i 's/\\x4D/M/g' $1 sed -i 's/\\x4E/N/g' $1 sed -i 's/\\x4F/O/g' $1 sed -i 's/\\x50/P/g' $1 sed -i 's/\\x51/Q/g' $1 sed -i 's/\\x52/R/g' $1 sed -i 's/\\x53/S/g' $1 sed -i 's/\\x54/T/g' $1 sed -i 's/\\x55/U/g' $1 sed -i 's/\\x56/V/g' $1 sed -i 's/\\x57/W/g' $1 sed -i 's/\\x58/X/g' $1 sed -i 's/\\x59/Y/g' $1 sed -i 's/\\x5A/Z/g' $1 sed -i 's/\\x5B/[/g' $1 sed -i 's/\\x5C/\/g' $1 sed -i 's/\\x5D/]/g' $1 sed -i 's/\\x5E/^/g' $1 sed -i 's/\\x5F/_/g' $1 sed -i 's/\\x60/`/g' $1 sed -i 's/\\x61/a/g' $1 sed -i 's/\\x62/b/g' $1 sed -i 's/\\x63/c/g' $1 sed -i 's/\\x64/d/g' $1 sed -i 's/\\x65/e/g' $1 sed -i 's/\\x66/f/g' $1 sed -i 's/\\x67/g/g' $1 sed -i 's/\\x68/h/g' $1 sed -i 's/\\x69/i/g' $1 sed -i 's/\\x6A/j/g' $1 sed -i 's/\\x6B/k/g' $1 sed -i 's/\\x6C/l/g' $1 sed -i 's/\\x6D/m/g' $1 sed -i 's/\\x6E/n/g' $1 sed -i 's/\\x6F/o/g' $1 sed -i 's/\\x70/p/g' $1 sed -i 's/\\x71/q/g' $1 sed -i 's/\\x72/r/g' $1 sed -i 's/\\x73/s/g' $1 sed -i 's/\\x74/t/g' $1 sed -i 's/\\x75/u/g' $1 sed -i 's/\\x76/v/g' $1 sed -i 's/\\x77/w/g' $1 sed -i 's/\\x78/x/g' $1 sed -i 's/\\x79/y/g' $1 sed -i 's/\\x7A/z/g' $1 sed -i 's/\\x7B/{/g' $1 sed -i 's/\\x7C/|/g' $1 sed -i 's/\\x7D/}/g' $1 sed -i 's/\\x7E/~/g' $1 sed -i 's/\\x7F//g' $1 sed -i 's/\\x80/€/g' $1 sed -i 's/\\x81//g' $1 sed -i 's/\\x82/‚/g' $1 sed -i 's/\\x83/ƒ/g' $1 sed -i 's/\\x84/„/g' $1 sed -i 's/\\x85/…/g' $1 sed -i 's/\\x86/†/g' $1 sed -i 's/\\x87/‡/g' $1 sed -i 's/\\x88/ˆ/g' $1 sed -i 's/\\x89/‰/g' $1 sed -i 's/\\x8A/Š/g' $1 sed -i 's/\\x8B/‹/g' $1 sed -i 's/\\x8C/Œ/g' $1 sed -i 's/\\x8D//g' $1 sed -i 's/\\x8E/Ž/g' $1 sed -i 's/\\x8F//g' $1 sed -i 's/\\x90//g' $1 sed -i 's/\\x91/'/g' $1 sed -i 's/\\x92/'/g' $1 sed -i 's/\\x93/“/g' $1 sed -i 's/\\x94/”/g' $1 sed -i 's/\\x95/•/g' $1 sed -i 's/\\x96/–/g' $1 sed -i 's/\\x97/—/g' $1 sed -i 's/\\x98/˜/g' $1 sed -i 's/\\x99/™/g' $1 sed -i 's/\\x9A/š/g' $1 sed -i 's/\\x9B/›/g' $1 sed -i 's/\\x9C/œ/g' $1 sed -i 's/\\x9D//g' $1 sed -i 's/\\x9E/ž/g' $1 sed -i 's/\\x9F/Ÿ/g' $1 sed -i 's/\\xA0//g' $1 sed -i 's/\\xA1/¡/g' $1 sed -i 's/\\xA2/¢/g' $1 sed -i 's/\\xA3/£/g' $1 sed -i 's/\\xA4/¤/g' $1 sed -i 's/\\xA5/¥/g' $1 sed -i 's/\\xA6/¦/g' $1 sed -i 's/\\xA7/§/g' $1 sed -i 's/\\xA8/¨/g' $1 sed -i 's/\\xA9/©/g' $1 sed -i 's/\\xAA/ª/g' $1 sed -i 's/\\xAB/«/g' $1 sed -i 's/\\xAC/¬/g' $1 sed -i 's/\\xAD//g' $1 sed -i 's/\\xAE/®/g' $1 sed -i 's/\\xAF/¯/g' $1 sed -i 's/\\xB0/°/g' $1 sed -i 's/\\xB1/±/g' $1 sed -i 's/\\xB2/²/g' $1 sed -i 's/\\xB3/³/g' $1 sed -i 's/\\xB4/´/g' $1 sed -i 's/\\xB5/µ/g' $1 sed -i 's/\\xB6/¶/g' $1 sed -i 's/\\xB7/·/g' $1 sed -i 's/\\xB8/¸/g' $1 sed -i 's/\\xB9/¹/g' $1 sed -i 's/\\xBA/º/g' $1 sed -i 's/\\xBB/»/g' $1 sed -i 's/\\xBC/¼/g' $1 sed -i 's/\\xBD/½/g' $1 sed -i 's/\\xBE/¾/g' $1 sed -i 's/\\xBF/¿/g' $1 sed -i 's/\\xC0/À/g' $1 sed -i 's/\\xC1/A/g' $1 sed -i 's/\\xC2/Â/g' $1 sed -i 's/\\xC3/Ã/g' $1 sed -i 's/\\xC4/Ä/g' $1 sed -i 's/\\xC5/Å/g' $1 sed -i 's/\\xC6/Æ/g' $1 sed -i 's/\\xC7/Ç/g' $1 sed -i 's/\\xC8/È/g' $1 sed -i 's/\\xC9/E/g' $1 sed -i 's/\\xCA/Ê/g' $1 sed -i 's/\\xCB/Ë/g' $1 sed -i 's/\\xCC/Ì/g' $1 sed -i 's/\\xCD/I/g' $1 sed -i 's/\\xCE/Î/g' $1 sed -i 's/\\xCF/Ï/g' $1 sed -i 's/\\xD0/Ð/g' $1 sed -i 's/\\xD1/Ñ/g' $1 sed -i 's/\\xD2/Ò/g' $1 sed -i 's/\\xD3/O/g' $1 sed -i 's/\\xD4/Ô/g' $1 sed -i 's/\\xD5/Õ/g' $1 sed -i 's/\\xD6/O/g' $1 sed -i 's/\\xD7/×/g' $1 sed -i 's/\\xD8/Ø/g' $1 sed -i 's/\\xD9/Ù/g' $1 sed -i 's/\\xDA/U/g' $1 sed -i 's/\\xDB/Û/g' $1 sed -i 's/\\xDC/U/g' $1 sed -i 's/\\xDD/Ý/g' $1 sed -i 's/\\xDE/Þ/g' $1 sed -i 's/\\xDF/ß/g' $1 sed -i 's/\\xE0/à/g' $1 sed -i 's/\\xE1/a/g' $1 sed -i 's/\\xE2/â/g' $1 sed -i 's/\\xE3/ã/g' $1 sed -i 's/\\xE4/ä/g' $1 sed -i 's/\\xE5/å/g' $1 sed -i 's/\\xE6/æ/g' $1 sed -i 's/\\xE7/ç/g' $1 sed -i 's/\\xE8/è/g' $1 sed -i 's/\\xE9/e/g' $1 sed -i 's/\\xEA/ê/g' $1 sed -i 's/\\xEB/ë/g' $1 sed -i 's/\\xEC/ì/g' $1 sed -i 's/\\xED/i/g' $1 sed -i 's/\\xEE/î/g' $1 sed -i 's/\\xEF/ï/g' $1 sed -i 's/\\xF0/ð/g' $1 sed -i 's/\\xF1/ñ/g' $1 sed -i 's/\\xF2/ò/g' $1 sed -i 's/\\xF3/o/g' $1 sed -i 's/\\xF4/ô/g' $1 sed -i 's/\\xF5/õ/g' $1 sed -i 's/\\xF6/o/g' $1 sed -i 's/\\xF7/÷/g' $1 sed -i 's/\\xF8/ø/g' $1 sed -i 's/\\xF9/ù/g' $1 sed -i 's/\\xFA/u/g' $1 sed -i 's/\\xFB/û/g' $1 sed -i 's/\\xFC/u/g' $1 sed -i 's/\\xFD/ý/g' $1 sed -i 's/\\xFE/þ/g' $1 sed -i 's/\\xFF/\ÿ/g' $1 

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

 sh thementionedscript.sh hexstrings.txt 

– >> все символы HEX в hexstrings.txt должны быть преобразованы в обычные символы, например: before:

 \x68\x69 

после:

 hi 

В bash :

 #!/bin/bash while IFS= read -r line; do printf "$line" done 

IFS= требуется для остановки вскрытия IFS, то есть в большинстве случаев (где IFS содержит пробелы, что является нормой), если вы не делаете IFS пустым, пробелы будут удалены с каждой стороны "${line}" независимо от того, что вы его процитировали. Опция -r для чтения останавливает обратную интерпретацию.

Имейте в виду, что это также будет интерпретировать другие escape-коды, которые могут присутствовать в вашем источнике. Если это касается вас, прочитайте символ файла по символу и активируйте команду printf только с \ x escape-кодами.

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

 ./foo < myfile > mytempfile && mv mytempfile myfile 

Кроме того, не используйте sed -i для редактирования файлов, он не переносится, и даже там, где это синтаксис, различается между реализациями (например, ваш код не будет работать в Mac OSX и большинстве BSD). ed – лучший вариант для редактирования файлов.

В bash?

 #!/bin/bash while IFS= read line do echo -e "$line" done 

Вот новый вопрос по этому вопросу …

Чтобы использовать sed для внесения изменений, вы составляете 97% пути.
Вот некоторые важные и некоторые дополнительные моменты, чтобы заставить его работать.

  • Может быть полезно сделать все ваши шаблоны нечувствительными к регистру. Используйте ig вместо g

  • Вы можете сделать все замены за один проход. Просто конкатенируйте их, например. 's/\\x00/NUL/ig;s/\\x01/SOH/ig;s/\\x02/STX/ig;...' ,
    или
    's/\\x01/SOH/ig;
    s/\\x02/STX/ig;
    ...
    s/\\xFE/þ/ig;
    s/\\xFF/ÿ/ig;'

  • Вам нужно изменить некоторые из замещающих выражений:
    /'/ должен быть /\x27/ Он сталкивается с цитированием ' in 's / a / b / ig'
    /\/ должно быть /\\/ В противном случае оно ускользает от /
    /&/ должен быть /\&/ Как сам по себе, это обратная ссылка

  • Вам нужно переключить / разделитель, когда / встречается в вашем замещающем выражении. Просто для этого одного выражения измените его на | (или что бы то ни было, ваше воображение), например. s|\\x2F|/|g; Некоторые ситуации sed требуют, чтобы они были экранированы в начале шаблона, например. выражение диапазона. '\|^abc|q'

  • Я заметил несколько отличий в вашем списке по сравнению с тем, что я придумал (на основе кодировки Windows-1252). Вы можете проверить их: 7F ('DEL') A0 ('') AD ('SHY')

  • Я сталкиваюсь с различными отчетами о том, как sed -i обрабатывает так называемые обновления insitu. Он использует временный файл в любом случае, поэтому я склоняюсь к использованию sponge (пакет moreutils ) для перезаписи текстового файла.

Вот и все. Вот пример результирующей команды sed …

  sed -e ' s/\\x01/SOH/ig; s/\\x02/STX/ig; ... s/\\xFE/þ/ig; s/\\xFF/ÿ/ig; ' "$1" | sponge "$1" 

Полную команду можно найти в файле paste.ubuntu

ОБНОВЛЕНИЕ Если вы хотите интерпретировать шестнадцатеричные значения как Windows-1252 и представлять их в кодировке текущего языка (обычно UTF-8 для * nix), вы можете использовать следующую команду. Заметка. Что помимо новых строк (\ n) для каждой строки ввода, этот фрагмент принимает в качестве входных данных только данные в форме \x33\x66\x99\xBB\xFF … что-нибудь еще вызывает ошибку.

 <file sed -re 's|(.)\\x|\1,0x|g; s|^\\x|0x|; $!{s|$|,0x0a|}' | tr '\n' ',' | recode Windows-1252/x1..UTF-8 

Отсюда мой первоначальный ответ (который не учитывает разные кодировки)

Вы можете использовать xxd в режиме revert (-r) postscript (-p). xxd является частью пакета vi .
Заметка. Данные теста содержат шестнадцатеричные символы \ n (\ x0a).
xxd игнорирует любые реальные символы \ n, поэтому вы разбиваете шестнадцатеричные данные на столько строк, сколько хотите (как в тестовом файле).

xxd также полезен для преобразования прямого гексагона, например. 68656c6c6f20776f726c64 (hello world) … sed в этом примере используется исключительно для удаления `\ x '.

Этот первый фрагмент игнорирует символы, которые не находятся в формате \ xXX …

 <file sed -e 's|\\x||g' | xxd -p -r 

Если вы хотите сохранить новые строки (\ n vs \ x0a) из файла souce, используйте это (другой текст игнорируется)

 <file sed -e 's|\\x||g; s|$|0a|' | xxd -p -r 

создать тестовый файл

 echo -n " \x63\x61\x74\x0a\x64\x6f\x67\x0a\x62\x69\x72\x64\x0a\x6d\x6f\x6f \x73\x65\x0a\x61\x6c\x62\x61\x74\x72\x6f\x73\x73" >file 

вывода (из первого фрагмента, который действует только на данные \ xXX)

 cat dog bird moose albatross