Вам нужно будет разбить файл на разделы по конечному файлу и выполнить 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)).