За исключением правильного синтаксического анализа исходного кода, чтобы нас не сбили с толку комментарии или строки, которые могут ложно совпадать, приведенный ниже скрипт просто ищет в обратном направлении от заданных номеров строк в заданных файлах строку"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" и выдает здесь -документ со списком инструкций, а именно:
"function "
--там невидимый пробел 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
Переформатировать по вкусу.
tar может создавать или извлекать файлы tar, но не может таким образом работать с потоками.
Вам понадобится что-то вродеtar-stream
-у него даже есть пример, который делает то, что вы просите:
https://github.com/mafintosh/tar-stream#modifying-existing-tarballs