У меня длинная шестнадцатеричная строка 00121eafc5800020 ... и т.д.
Есть ли простой способ разделить их с пробелом в шестнадцатеричном байте, чтобы я получил 00 12 1e af c5 80 00 20 в vim (или другой легко доступный инструмент)
$ sed 's/\(..\)/\1 /g' <<< '1234567890'
12 34 56 78 90
Попробуйте эту последовательность клавиш (с начала числа):q1lxPpr lq@1@1@1@1@1@1@1@1
(и т.д. Или, скажем, 20 @ 1)
В 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
:%s/\x\x/& /g
достаточно.
Если вы хотите разрезать на несколько строк, вы также можете применить это :substitute
сначала.
:%s/\x\{16}/&\r/g
Или, если вы предпочитаете однострочник (я не уверен, что это лучшее решение здесь)
:%s/\x\{16}/\=substitute(submatch(0), '\x\x', '& ', 'g')."\n"/g