If i help You, send me BTC please 1CJGz4UGyL7hTjPeN8j7fu9LRmmWiWSRHi

Замена текста в нескольких файлах Linux из командной строки.

Постов 40 из 175

Мне понадобилось менять записи в нескольких текстовых файлах, а именно при редактировании страниц  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" {} \;

myr4ik0729/08/2014 at 20:41Reply

Дякую

Ida27/05/2015 at 17:10Reply

That’s a wise answer to a tricky quitseon

Menu