Я не уверен, что понимаю общую картину того, о чем вы просите, но у меня есть несколько подходов, которые вы, возможно, захотите рассмотреть:
dd
, чтобы прочитать ваш ввод file exec 3 < input_file while true do dd bs=1 count=1 <&3 > this_byte if ! [ -s this_byte ] # If size is zero, we’re done. then break fi code using the this_byte file ︙ done
od
, чтобы обработать ваш входной файл od -bv input_file | while read a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 do # Skip $a0; it’s the address. for byte_val in "$a1" "$a2" "$a3" "$a4" "$a5" "$a6" "$a7" "$a8" "$a9" "$a10" \ "$a11" "$a12" "$a13" "$a14" "$a15" "$a16" do if [ "$byte_val" = "" ] then break fi code using the $byte_val value for example: echo -e "\0$byte_val\c" ︙ done done
Часто APT-GOW предпочтет удалить десятки пакетов вместо того, чтобы просто обновить пару других пакетов.
Я обычно запускаю способность в интерактивном режиме, выберите пакет, который я хочу установить с помощью +, а затем проверять, какие другие пакеты могут быть нарушены этим действием (перейти к следующему «сломанному» пакету с ключом «B». Часто просто просто Обновление тех (опять же с +) решит проблему с небольшим количеством хлопот. Когда все решено, нажмите «g» для «идти и сделать это». Он покажет сводку того, что произойдет (страница через полный список, это кроме закодирован, чтобы помочь), а затем нажмите «G» снова, когда доволен.
-121--175571- Вместо этого вы можете использовать Perl
вместо этого:
$ printf '%s%s%s' 'ăâé' | LC_ALL=C.UTF-8 perl -Mopen=locale -ne '
BEGIN { $/ = \1 }
printf "%s\n", $_;
'
ă
â
é
Используйте dd
или xxd
(часть Vim), например, для чтения одного байта ( -l
) по смещению 100 ( -s
) из двоичного файла попробуйте:
xxd -p -l1 -s 100 file.bin
использовать шестнадцатеричные смещения, в Bash вы можете использовать этот синтаксис $ ((16 # 64))
, например:
echo $((16#$(xxd -p -l1 -s $((16#FC)) file.bin)))
, который считывает байт со смещением FC
и печатает его в десятичном формате.
В качестве альтернативы используйте dd
, например:
dd if=file.bin seek=$((16#FC)) bs=1 count=5 status=none
, который будет выгружать необработанные данные размером 5 байтов с шестнадцатеричным смещением FC
.
Затем вы можете присвоить его переменной, однако он не будет работать, если ваши данные содержат NULL байты , поэтому вы можете либо пропустить их ( xxd -a
), либо как обходной путь вы можете хранить их в простом шестнадцатеричном формате.
Например:
Прочитать 10 байтов со смещением 10 в переменную, содержащую байты в шестнадцатеричном формате:
hex = $ (xxd -p -l 10 -s 10 file.bin)
Затем запишите их в файл или на устройство:
xxd -r -p> out.bin <<< $ hex
Вот несколько полезных функций в Bash:
set -e
# Read single decimal value at given offset from the file.
read_value() {
file="$1"
offset="$2"
[ -n "$file" ]
[ -n "$offset" ]
echo $((16#$(xxd -p -l1 -s $offset "$file")))
}
# Read bytes in hex format at given offset from the file.
read_data() {
file="$1"
offset="$2"
count="$3:-1"
xxd -p -l $count -s $offset "$file"
}
Пример использования:
read_value file.bin $((16#FC)) # Read 0xFC offset from file.bin.
Это, вероятно, проще сделать с помощью крошечной программы на C или (почти) однострочной программы на языке сценариев, таком как Python или Perl.
Оболочка Unix - это интерпретатор пользовательских команд , который (для удобства написания повторяющихся команд) имеет элементарные средства программирования. Его часто (неправильно) используют, потому что версия оболочки Bourne гарантированно будет доступна в любой системе Unix, а не потому, что это особенно хороший (или даже наполовину достойный) язык программирования.