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

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

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

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

  • Bash: Zipping / группировка файлов по общей подстроке
  • Замещать содержимое папки без включения самой папки
  • Zip не сжимает файлы при застегивании
  • Какой язык сценариев я могу использовать для автоматизации процесса конкатенации и копирования?
  • Как я могу игнорировать «zip warning: name not match» при использовании команды zip с опцией -d?
  • Bash, чтобы получить результат передачи rsync и закрепить его как каталог в исходном каталоге
  • Linux + как автоматически сжимать старые файлы журналов
  • Как я могу заставить unzip / 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 - лучшая ОС в мире.