"Прицельная" рекурсивная замена чего-либо в файлах: различия между версиями
Материал из Linux Wiki
Перейти к навигацииПерейти к поиску
Rain (обсуждение | вклад) (Новая: Скрипт для рекурсивной замены какой-либо строки, попадающей под регулярное выражение, в файлах в указ...) |
Rain (обсуждение | вклад) |
||
(не показано 5 промежуточных версий этого же участника) | |||
Строка 6: | Строка 6: | ||
; Принцип работы: ''grep'' делает рекурсивный поиск в файлах, исключая бинарники по регулярному выражению, описываему в '''source''', игнорируя регистр и выдает строку в формате "файл:номер строки:выражение, описываемое '''source'''". Данная строка обрабатывается awk'ом, который заменяет двоеточие на пробел и выводит строку в виде "файл номер_строки вся_строка". Строка передается циклу, где от 3-го параметра (т.е., всей строки) отрезается выражение, описываемое '''source'''. После этого ''sed'' делает замену '''$what''' на '''$to''' только лишь для строки '''$string''' для данного файла. | ; Принцип работы: ''grep'' делает рекурсивный поиск в файлах, исключая бинарники по регулярному выражению, описываему в '''source''', игнорируя регистр и выдает строку в формате "файл:номер строки:выражение, описываемое '''source'''". Данная строка обрабатывается awk'ом, который заменяет двоеточие на пробел и выводит строку в виде "файл номер_строки вся_строка". Строка передается циклу, где от 3-го параметра (т.е., всей строки) отрезается выражение, описываемое '''source'''. После этого ''sed'' делает замену '''$what''' на '''$to''' только лишь для строки '''$string''' для данного файла. | ||
; Примечание: '''grep''' и '''sed''' в данном скрипте игнорирует регистр букв в выражениии, если это не нужно - убрать '''i''' в ключах '''grep''' и в командах '''sed'''. | |||
---- | ---- | ||
<source lang="bash"> | <source lang="bash"> | ||
to='target' | to='target' | ||
Строка 18: | Строка 19: | ||
done | done | ||
</source> | </source> | ||
---- | |||
[[Category: | [[Category:Sed]][[Category:Bash-скрипт]][[Category:Скрипт]] |
Текущая версия на 18:13, 15 октября 2008
Скрипт для рекурсивной замены какой-либо строки, попадающей под регулярное выражение, в файлах в указанной директории.
- target задает то, на что надо заменять строку или часть строки.
- source задает регулярное выражение, по которому надо отсеивать нужные строки
- directory/ задает каталог, в котором производится поиск
- Принцип работы
- grep делает рекурсивный поиск в файлах, исключая бинарники по регулярному выражению, описываему в source, игнорируя регистр и выдает строку в формате "файл:номер строки:выражение, описываемое source". Данная строка обрабатывается awk'ом, который заменяет двоеточие на пробел и выводит строку в виде "файл номер_строки вся_строка". Строка передается циклу, где от 3-го параметра (т.е., всей строки) отрезается выражение, описываемое source. После этого sed делает замену $what на $to только лишь для строки $string для данного файла.
- Примечание
- grep и sed в данном скрипте игнорирует регистр букв в выражениии, если это не нужно - убрать i в ключах grep и в командах sed.
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