Вставить байты в файл с помощью оболочки

Я хотел бы использовать оболочку Linux (bash, zsh и т. д.), чтобы вставить набор известных байтов в файл в определенной позиции. Были заданы похожие вопросы, но они изменяют байты файла на месте. Эти вопросы не касаются вставки новых байтов в определенные позиции.

Например, если в моем файле есть последовательность байтов вроде \x32\x33\x35, я могу вставить \x34 в позицию 2, чтобы эта последовательность байтов в файле стала \x32\x33\x34\x35.


person fuzzybear3965    schedule 24.04.2019    source источник


Ответы (1)


Вы можете добиться этого, используя head, tail и printf вместе. Например; чтобы вставить \x34 в позицию 2 в file:

{ head -c 2 file; printf '\x34'; tail -c +3 file; } > new_file

Для соответствия POSIX можно использовать \064 (восьмеричное представление \x34).

Чтобы внести это изменение на месте, просто переместите new_file в file.


Независимо от того, какой инструмент(ы) вы используете, эта операция потребует много процессорного времени для больших файлов.

person oguz ismail    schedule 24.04.2019
comment
Это сработало отлично! Чтобы было ясно, { head -c M file; printf %0Ns | tr \0 '\x34'; tail -c +(N+M) file; } > new_file для вставки N повторяющихся экземпляров \x34, начиная с позиции M. - person fuzzybear3965; 24.04.2019
comment
Вы знаете, почему { head -c 2 file; printf '\x34'; tail -c +3 file; } > file не работает? Он выводит только один байт (\x34) в file. Вы были правы, говоря, что мне придется сделать mv new_file file потом. Но почему? - person fuzzybear3965; 24.04.2019
comment
@ fuzzybear3965, потому что при этом вы пишете в файл, открытый для чтения ранее. вот лучшее объяснение этому [unix.stackexchange.com/a/15829/309777]. - person oguz ismail; 24.04.2019
comment
Это было прекрасно. Вы ответили на все мои опасения. Большое спасибо. - person fuzzybear3965; 24.04.2019