У меня длинная шестнадцатеричная строка 00121eafc5800020 ... и т.д.

Есть ли простой способ разделить их с пробелом в шестнадцатеричном байте, чтобы я получил 00 12 1e af c5 80 00 20 в vim (или другой легко доступный инструмент)

4 ответа4

5
$ sed 's/\(..\)/\1 /g' <<< '1234567890'
12 34 56 78 90 
0

Попробуйте эту последовательность клавиш (с начала числа):q1lxPpr lq@1@1@1@1@1@1@1@1 (и т.д. Или, скажем, 20 @ 1)

0

В vim вы можете использовать :s/\([0-9a-f][0-9a-f]\)/\1 /g чтобы делать то, что вы хотите. Чтобы проверить это, вы можете использовать следующую команду:

dd bs=512 if=/dev/urandom count=2 2>/dev/null | xxd -p | tr -d '\n' | vim -

Затем в vim используйте :s/\([0-9a-f][0-9a-f]\)/\1 /g чтобы добавить пробел после каждой пары шестнадцатеричных символов. Вот небольшой пример:

$ dd bs=32 if=/dev/urandom count=1 2>/dev/null | xxd -p | tr -d '\n' | vim -
6aad5f800a739fadbc3e2312230daeca8055491577b0e0d75a37bb3777f0a3e0
:s/\([0-9a-f][0-9a-f]\)/\1 /g
6a ad 5f 80 0a 73 9f ad bc 3e 23 12 23 0d ae ca 80 55 49 15 77 b0 e0 d7 5a 37 bb 37 77 f0 a3 e0 
0
:%s/\x\x/& /g

достаточно.

Если вы хотите разрезать на несколько строк, вы также можете применить это :substitute сначала.

:%s/\x\{16}/&\r/g

Или, если вы предпочитаете однострочник (я не уверен, что это лучшее решение здесь)

:%s/\x\{16}/\=substitute(submatch(0), '\x\x', '& ', 'g')."\n"/g

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .