"Прицельная" рекурсивная замена чего-либо в файлах: различия между версиями

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску
(Новая: Скрипт для рекурсивной замены какой-либо строки, попадающей под регулярное выражение, в файлах в указ...)
 
Строка 8: Строка 8:


----
----
<source lang="bash">
<source lang="bash">
to='target'
to='target'
Строка 18: Строка 17:
done
done
</source>
</source>
----


[[Category:Bash]][[Category:Sed]][[Category:Скрипт]]
[[Category:Bash]][[Category:Sed]][[Category:Скрипт]]

Версия 14:24, 15 октября 2008

Скрипт для рекурсивной замены какой-либо строки, попадающей под регулярное выражение, в файлах в указанной директории.

  • target задает то, на что надо заменять строку или часть строки.
  • source задает регулярное выражение, по которому надо отсеивать нужные строки
  • directory/ задает каталог, в котором производится поиск
Принцип работы
grep делает рекурсивный поиск в файлах, исключая бинарники по регулярному выражению, описываему в source, игнорируя регистр и выдает строку в формате "файл:номер строки:выражение, описываемое source". Данная строка обрабатывается awk'ом, который заменяет двоеточие на пробел и выводит строку в виде "файл номер_строки вся_строка". Строка передается циклу, где от 3-го параметра (т.е., всей строки) отрезается выражение, описываемое source. После этого sed делает замену $what на $to только лишь для строки $string для данного файла.

to='target'
grep --color -oiIrn "source" directory/ | awk -F':' '{print $1, $2, $0}' |
while read file string all
	do
	what=$(echo "${all}" | cut -d: -f3-)
	sed -i -e "${string}s@${what}@${to}@gi" "${file}"
done