Подмена текста внутри сжатых файлов

У меня есть несколько файлов zip, каждый из которых имеет несколько текстовых файлов внутри них. Я хочу заменить все вхождения a в эти текстовые файлы на b и оставить их заархивированными с той же структурой.

Если бы я просто хотел найти вхождения a , я знаю, что могу использовать команду zgrep , но я также хочу выполнить замену строк. К сожалению, нет команды zsed .

У меня нет выбора, кроме как написать скрипт с циклом?

  • Высокая загрузка процессора с помощью zip-команды
  • Как я могу закрепить содержимое текущего каталога минус все скрытые файлы?
  • В сценарии оболочки, Как передать переменную другое значение после выполнения одного задания?
  • file-roller: произошла ошибка при загрузке архива (Zip / 7z)
  • Ошибка Ubuntu unzip: ошибка sysmalloc не выполнена
  • Depsolving для php-pecl-zip
  • Как узнать путь к определенному файлу в zip-архиве, не извлекая его?
  • Как grep файл bz2, который находится далее в папке с zip-файлом
  • 2 Solutions collect form web for “Подмена текста внутри сжатых файлов”

    Если вы хотите изменить текст в файлах в zip-файле, тогда у вас нет выбора, кроме как извлечь их, отредактировать и повторно добавить.

    Если вам нужно это сделать в большей части содержимого .zip (а не по количеству файлов, а всего сжатого количества), легче извлечь все в новый каталог, отредактировать соответствующие файлы и заархивировать все. Это, например, случай, когда редактирование всех .html файлов в .epub и оставление метаданных одинаково, так как метаданные с повторной заливкой занимают минимальное время по сравнению с остальными данными.

    Вы можете работать с монтированием zip-файла в каталог, после чего вы можете исследовать и изменять его, как если бы это был каталог.

    Установите плавкий предохранитель (доступный через менеджер пакетов во всех хороших дистрибутивах).

     mount_point=$(TMPDIR=$PWD mktemp -d) # Iterate over the .zip files in the current directory for z in *.zip; do fuse-zip "$z" "$mount_point" # At this point, the zip contents are available through the mount point find "$mount_point" -type f -exec sed -i 's/a/b/g' {} + fusermount -u "$mount_point" done rmdir "$mount_point" 

    (Примечание: я предполагаю синтаксис GNU sed в этом примере.)

    Linux и Unix - лучшая ОС в мире.