Вам нужно будет разбить файл на разделы по конечному файлу и выполнить sed -i
для каждого файла в отдельности. Предполагая, что у вас есть имена файлов и номера строк, сгруппированные по имени файла и в порядке возрастания, вы можете сделать что-то вроде
awk '$1 != prev { if (prev) print "\047 " prev;
prev=$1;
printf "sed -i \047" }
{ print $2 "s/LOG\\.error/LOG.warn/" }
END { if (prev) print "\047 " prev }' filenames.txt | sh
Это быстрый и грязный хак, который сломается интересными и, возможно, опасными способами, если имена файлов в первом столбце не являются единым токеном.
Мы в основном преобразуем ваш текстовый файл в последовательность сценариев sed
. Таким образом, ваш пример будет превращен в
sed -i '125s/LOG\.error/LOG.warn
180s/LOG\.error/LOG.warn/
' FooBar.java
sed -i '128s/LOG\.error/LOG.warn/
' FooBar2.java
которые вы заметите это sh
скрипт , который содержит один sed
для каждого файла.
Если вы работаете на платформе * BSD (включая Mac OS), вам нужно изменить sed -i
на sed -i ''
что в Awk будет "sed -i \047\047"
, чтобы правильно вставлять одинарные кавычки, не мешая кавычки окружающей оболочки (так что вся строка становится printf "sed -i \047\047 \047" }
(sic)).