Мне понадобилось менять записи в нескольких текстовых файлах, а именно при редактировании страниц Docuwiki, которая вся пишется в обычных текстовых файлах. Когда изменяется фрагмент текста на любой странице — хочется, чтобы этот фрагмент соответственно изменялся рекурсивно во всех подразделах. Сделать это можно очень просто, и решение есть на просторах интернетов. Выписал вот для себя заметочку.
find ./ -type f -readable -writable -exec sed -i "s/старый_текст/новый_текст/g" {} \;
В результате в том каталоге, откуда запущена команда и во всех подкаталогах во всех файлах старый_текст будет заменен на новый_текст.
Вместо определенных строк можно задавать регулярные выражения. Например, если необходимо заменить все вхождения старой строки, кроме тех, которым предшествует символ «|», то команду стоит переписать следующим образом:
find ./ -type f -readable -writable -exec sed -i "s/[^\|]старый_текст/новый_текст/g" {} \;
Если необходимо просто вывести в консоль все файлы, в которых встречается «строка», то:
find ./ -type f -exec grep -l "строка" {} +
Есть также возможность искать некоторые подстроки, заданные регулярным выражением, и дополнять то, что будет найдено. Например, чтобы найти все IP-адреса в файлах каталога /home/usefree/dokuwiki/data/pages/ и «обернуть» их в квадратные скобки я использовал команду:
find /home/usefree/dokuwiki/data/pages/ -type f -readable -writable -exec sed -i "s/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\b/[&]/g" {} \;
Дякую
That’s a wise answer to a tricky quitseon