Пример поиска и замены в Linux
Недавно я оказался в ситуации, когда мне пришлось изменить текст, который появился в кучке файлов конфигурации, которые находились во вложенных подкаталогах. Не имея времени отряхнуть 10-летний опыт работы с Perl, я искал некоторые команды оболочки, которые бы работали. Удивительно, но в сети есть много примеров, которые работают сnot, поэтому я остановился на следующих вариантах:
Не стесняйтесь сначала протестировать их и изучить, как они работают. В обоих случаях мы передаем список нужных нам файлов в команду «sed» linux, используя xargs для построения команды sed (см.this article для интересного обзора xargs).
1. Найти и заменить все файлы
Если вам нужно заменить определенный набор текста в наборе файлов, но вы не знаете, какие файлы могут содержать искомый текст, это может быть полезно:
grep -lr -e 'old text' * | xargs sed -i 's/old text/new text/g'
Используя здесь grep, мы рекурсивно (опция «-r») ищем файлы, содержащие текст «старый текст». Здесь вы действительно можете проявить творческий подход с регулярным выражением, чему способствует опция «-e».
Grep предоставляет список файлов (опция «-l»), для которых нужно выполнить фактический поиск и замену (вы можете запустить эту часть самостоятельно, чтобы увидеть ее результат); этот список файлов затем передается команде set, которая затем выполняет фактическую работу по поиску и замене старого текста новым текстом.
Параметр «-i» команды sed приводит к редактированию на месте, что означает, что исходный файл изменен (в моей ситуации это было необходимо, но можно указать sed сделать резервную копию, если вы предоставите его с помощью -i). «S» в «s /…» означает «замену», а «g» означает «глобальную замену» - именно это и происходит.
2. Найти и заменить указанный файл
Если вы знаете имя файла, который нужно обновить, вы можете использовать этот вариант:
find -name myconfig_file.txt | xargs sed -i 's/old text/new text/g'
По сути, это та же идея, но вместо этого используется операция поиска для предоставления списка файлов, соответствующих заданному имени. Это проходит через все подкаталоги, начиная с текущего. Затем список файлов передается в sed таким же образом, как описано выше.
P.S Above command tested on Ubuntu and RedHat