Пример поиска и замены в Linux

Пример поиска и замены в 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