вид-u удаляет уникальные строки. Так, потенциальная проблема состоит в том, что эти три строки не являются тем же, и sort -u
оставит всех их:
foo
foo
foo
Неважно, как тесно Вы смотрите, его твердое для замечания почему. Таким образом, если Вы не берете шестнадцатеричный дамп, с xxd
например:
0000000: 666f 6f0a 666f 6f20 0a66 6f6f e280 820a foo.foo .foo....
0x0a
новая строка, если Вы не знакомы с шестнадцатеричными дампами. Так три "нечто" s:
666f 6f 0a
666f 6f20 0a
666f 6fe2 8082 0a
Ага! Это на самом деле foo
, foo<SPACE>
( 0x20
), и foo<EN-SPACE>
( 0xe28082
, который является U+2002, закодированным в UTF-8).
Вы, вероятно, получили что-то подобное продолжение. Необходимо использовать Hex-редактор или набор текстового редактора для показа невидимых символов. Например, вот то, в чем это похоже gvim
с :set list
. Я только что ввел ga
команда для наблюдения, каков символ под курсором, показывая что его U+2002. Можно также видеть как конец строки ($
) не то, где Вы ожидаете на двух с пробелами после них:
У меня действительно та же проблема, что и у вас уже много лет.
Для простых неинтерактивных применений мне нравится использовать редактор двоичных блоков BBE . BBE - это двоичный код, как SED - текстовый, включая его архаичный синтаксис и простоту, однако в нем отсутствует множество функций, которые мне часто нужны, поэтому мне приходится комбинировать его с другими инструментами. Итак, BBE - это лишь частичное решение. Также обратите внимание, что BBE не имеет обновлений или улучшений в течение многих лет.
Конечно, можно использовать xxd
до и xxd -r
после редактирования данных с помощью текстовых инструментов, но это не сработает, если данные большие и произвольный доступ необходим, например, при обработке блочных устройств.
(Примечание: для Windows существует, по крайней мере, дорогостоящий проприетарный язык сценариев WinHex, но он нас ни к чему не приведет.)
Для более сложного двоичного редактирования я обычно также прибегаю к Python, даже хотя иногда он слишком медленный для больших файлов, что является его основным недостатком. Я надеюсь, что Pyston (Python, использующий LLVM для компиляции в оптимизированный машинный код) когда-нибудь станет достаточно зрелым, чтобы его можно было использовать, или, что еще лучше, кто-то разработает и реализует бесплатный компактный, быстрый и универсальный язык сценариев для двоичной обработки, который AFAIK еще не существует для систем типа U * IX.
ОБНОВЛЕНИЕ
Я также использовал homebrew, ассемблер Intel x86 с открытым исходным кодом плоский ассемблер или fasm для краткости, который превратился в нечто большее, чем просто ассемблер.
Он имеет мощный макропроцессор на основе текстовых блоков (сам по себе полный язык по Тьюрингу) с синтаксисом в традициях макроязыка Borland Turbo Assessment, но гораздо более продвинутый.
Кроме того, в нем есть язык обработки данных, который позволяет включать в двоичный код произвольные файлы, выполнять с ним все виды двоичных и арифметических операций (только целые числа) во время «компиляции» и записывать результат в выходной файл. Этот язык манипулирования данными имеет структуры управления и также является полным по Тьюрингу.
Это намного проще в использовании, чем писать программу, которая выполняет некоторые бинарные манипуляции на C и, возможно, даже на python. Кроме того, он загружается ослепительно быстро, поскольку это исполняемый файл небольшого размера почти без внешних зависимостей (существует 2 версии: либо для него требуется только libc, либо он может работать как статический исполняемый файл непосредственно в ABI ядра Linux).
У него есть некоторые грани, например,
не поддерживает параллелизм
записывается в 32-битной сборке x86 (хотя работает на x86_64), вам, вероятно, понадобится qemu или аналогичный эмулятор, если вы хотите запустить его на чем-нибудь кроме x86 или x86_64
, это мощный язык препроцессора макросов, завершенный по Тьюрингу, это означает, что вам лучше иметь некоторый опыт работы с такими языками, как Lisp, Haskell, XSLT или, вероятно, M4 будет лучшим выбором.
все данные, которые должны быть записаны в выходной файл, выполняются в «плоском» буфере в памяти, и этот буфер может увеличиваться, но не сокращаться, пока выходной файл не будет записан и не завершится fasm. Это означает, что за один запуск fasm можно создавать файлы размером не более, чем у вас осталось основной памяти.
данные могут быть записаны только в один выходной файл для каждого запуска fasm
да, это доморощенный, действительно изящный и умный
Вы сталкивались с beav
в нем есть макросы, но я не смог найти сценарии,
apt-cache show beav
extract :
С помощью beav вы можете редактировать файл в HEX, ASCII, EBCDIC, OCTAL, DECIMAL, и бинарный. Вы можете отображать, но не редактировать данные в режиме FLOAT. Вы можете поиск или поиск и замена в любом из этих режимов. Данные могут быть отображаться в форматах BYTE, WORD или DOUBLE WORD. При отображении WORDS или DOUBLE WORDS данные могут отображаться в формате INTEL или MOTOROLA в порядке следования байтов. Данные любой длины могут быть вставлены в любой точку файла. Источником этих данных может быть клавиатура, другой буфер или файл. Любые данные, которые отображаются на экране, могут быть могут быть отправлены на принтер в отображаемом формате. Файлы, размер которых превышает памяти, могут быть обработаны.
Далее есть xxd
, который конвертирует в/из двоичного/ascii режима отображения и может быть объединен с sed
или vi
, но не имеет функции замены байтов.
Вы всегда можете пойти на золото и выпадать в C или ASM. Если вы работаете с необработанным двоичным, просто отскочите через реестр. Вы уже «уже там».
Вы не обязательно должны «принимать мир» с распакомк Perl ... Один из великих вещей о Perl - это то, как вы можете злоупотреблять анализатором и таблицей символов, чтобы сделать свой собственный язык в пользовательском пакете.
Это в основном то, что вы ищете?
use MyBinLib;
my $struct= struct(
pack => 8,
size => 400,
fields => [int32('foo','bar','baz'), float32('x1','x2','x3','x4'), int8, int8, int16('z')]
);
while (my $rec= $struct->read(<STDIN>)) {
printf "x1 = %d, x2 = $d\n", $rec->x1, $rec->x2;
}
Упражнение, чтобы учиться достаточно Perl, чтобы написать пакет MyBINLIB. Спросите на форуме Perl и люди, вероятно, будут рады помочь.