Заменить двоичный файл в другом двоичном файле

Основная команда, которую вы хотите, должна, если я правильно понимаю, подсчитывать каждое вхождение искомого слова. Предполагая GNU grep:

<"$file" grep -Fwo -- "$word" | wc -l

Опция -F переключается на не-регексп, дословное сопоставление строк. -w выполняет поиск по слову, как в вашем вопросе, а -o печатает каждое совпадение отдельно, на отдельной строке, в результате чего выдается правильный счетчик wc -l.

Теперь о подсказках, вы можете воспользоваться тем фактом, что bash read имеет опцию -p:

read -p 'Filename: ' file
read -p 'Word: ' word

Задание принимает форму var=value, без знака доллара или пробелов вокруг знака равенства:

count=$(grep-command)

Наконец, вы можете воспользоваться преимуществами интерполяции строк при записи

echo "File '$file' contains this many occurrences of '$word': $count."
-2
07.04.2019, 13:03
1 ответ

Если вы хотите записать содержимое file.gzпо смещению 13596 в пределах firmware.bin(, перезаписав то, что уже есть ), вы должны сделать:

zsh:

zmodload zsh/system
{ sysseek -u1 13596 && cat; } < file.gz 1<> firmware.bin

ksh93:

cat < file.gz 1<> firmware.bin >#((13596))

dd, любая оболочка, но чтение и запись по одному байту за раз

dd conv=notrunc bs=1 seek=13596 if=file.gz of=firmware.bin

GNU dd, любая оболочка, более эффективная

dd bs=64k conv=notrunc oflag=seek_bytes seek=13596 if=file.gz of=firmware.bin

Или дополнить нулями до длины 1573192 -13596 (Синтаксис POSIX sh для арифметического расширения):

dd bs=64k conv=notrunc,sync bs="$((1573192 - 13596))" count=1 \
   oflag=seek_bytes seek=13596 if=file.gz of=firmware.bin

Теперь вам нужно, чтобы file.gzне превышал размер gzipped-файла, который уже был там. И если эти заголовки содержат контрольные суммы разных частей,тогда вам также нужно будет вычислить и обновить контрольные суммы.

3
28.01.2020, 05:15

Теги

Похожие вопросы