Изменение имен файлов в tar-файле без извлечения файлов во временное расположение

За исключением правильного синтаксического анализа исходного кода, чтобы нас не сбили с толку комментарии или строки, которые могут ложно совпадать, приведенный ниже скрипт просто ищет в обратном направлении от заданных номеров строк в заданных файлах строку"function "(в кавычки, чтобы вы могли видеть невидимый завершающий пробел):

#!/bin/sh
while read -r error file on line linenum
do
  : "SC2034: $error, $on, and $line are unused"
  printf 'For error in %s on line %d:\n' "$file" "$linenum"
  ed -s "$file" << EOF | sed '1d; s/function //; s/(.*//'
  $linenum
  ?function 
  q
EOF
  echo
done < logfile

Внешний whileцикл считывает logfileв две важные переменные :"$file" и "$linenum". Затем он вызывает edдля "$file" и выдает здесь -документ со списком инструкций, а именно:

  1. перейти к строке "$linenum"
  2. искать строку в обратном направлении"function "--там невидимый пробел
  3. qуит

Вывод edбудет состоять из двух строк :содержимого $linenum, за которыми следует строка перед ней, соответствующая "function ". Вот почему мы пропускаем весь этот вывод через sed, которому даются три команды:

  • 1d--удалить первую строку вывода
  • s/function //--удалить строку"function "
  • s/(.*//--удалить начиная с открывающей скобки

Пример вывода с учетом вашего ввода::

For error in foo.file on line 13:
    def_442

For error in foo.file on line 25:
    ghi

Переформатировать по вкусу.

6
01.07.2020, 12:53
1 ответ

tar может создавать или извлекать файлы tar, но не может таким образом работать с потоками.

Вам понадобится что-то вродеtar-stream-у него даже есть пример, который делает то, что вы просите:

https://github.com/mafintosh/tar-stream#modifying-existing-tarballs

4
18.03.2021, 23:22

Теги

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