Основная команда, которую вы хотите, должна, если я правильно понимаю, подсчитывать каждое вхождение искомого слова. Предполагая 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."
Если вы хотите записать содержимое 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
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
не превышал размер gzip
ped-файла, который уже был там. И если эти заголовки содержат контрольные суммы разных частей,тогда вам также нужно будет вычислить и обновить контрольные суммы.