Массовая замена в файлах

Статус
В этой теме нельзя размещать новые ответы.

dig555

Постоялец
Регистрация
22 Июн 2007
Сообщения
365
Реакции
160
Есть SSH доступ. Есть папка. В ней куча подпапок и файлов.
Задача - найти все файлы, которые называются допустим "myfile.html" (порядка 50 одинаковых файлов, с одинаковым названием), и заменить в них строчку Для просмотра ссылки Войди или Зарегистрируйся на Для просмотра ссылки Войди или Зарегистрируйся

Подскажите, плз, возможно ли это сделать через шелл? Как это должно выглядеть?
Наверное стоит смотреть в сторону sed, вроде как:
sed 's/stringa1/stringa2/g' example.txt replace "string1" with "string2" in example.txt
 
может, использовать ssh-клиента в пакетном режиме (batch mode)?
 
Есть SSH доступ. Есть папка. В ней куча подпапок и файлов.
Задача - найти все файлы, которые называются допустим "myfile.html" (порядка 50 одинаковых файлов, с одинаковым названием), и заменить в них строчку Для просмотра ссылки Войди или Зарегистрируйся на Для просмотра ссылки Войди или Зарегистрируйся
Подскажите, плз, возможно ли это сделать через шелл? Как это должно выглядеть?
Наверное стоит смотреть в сторону sed, вроде как:
sed 's/stringa1/stringa2/g' example.txt replace "string1" with "string2" in example.txt
Да, смотреть надо в сторону седа, только из-за наличия "/" в том что ты ищещь/на что меняешь надо изменить синтаксис на такой:
sed -e "s#http://site.com/dir/?page=100#http://another.com/dir2/?page=250#g"
Да и скриптик можно для это цели заюзать:
Код:
#!/bin/bash
FILES=`find . -name myfile.html`
for i in ${FILES} do
   sed -i -e "s#http://site.com/dir/?page=100#http://another.com/dir2/?page=250#g" $i
done
Кладешь его корень того, где искать будешь, делаешь исполняемым (chmod +x script.sh) и пускаешь. Должно робить.
ЗЫ. Писал из головы, но должно работать. На всякий случай сделай бекап.
 
Проблемку в тот раз решал всё-таки вручную. Ибо бекап сделать нет возможности. Но задача для меня очень актуальная, и в будущем возможно всплывёт не раз.
Поэтому давайте разберёмся до конца.
Собственно, главный вопрос - можно ли обойтись без баш-скриптинга?
Немножко порыл маны и нашёл конструкцию вроде такой:
Код:
find . -name *.html -exec sed -i 's/oldtext/newtext/g' {} \;
C учётом требований моей задачи, я думаю она должна выглядеть где-то так:
Код:
find . -name myfile.html -exec sed -i 's#http://site.com/dir/?page=100#http://another.com/dir2/?page=250#g'
Скажите, пожалуйста, возможна ли такая команда? И для чего в примере символы
Код:
 {} \;
 
Ибо бекап сделать нет возможности.
Это плохо. Тогда пока тренируешься не ставь ключик -i и файлы останутся не тронутыми, а результат будет валиться на экран. Там и увидишь ошибки, если они есть. Как все отработаешь и убедишься в отсутствии ошибок, пускай с ключем -i
для чего в примере символы
Код:
 {} \;
фигурные скобки - вместо них будет подставлен результат того что найдет find, а
Код:
 \;
обозначает конец аргументов (обратный слеш - экранизация). Все что находится между ними считается аргументами для команды.
Соответственно, использование этих символов в твоем случае необходимо.
Код:
find . -name myfile.html -exec sed -i 's#http://site.com/dir/?page=100#http://another.com/dir2/?page=250#g' {} \;
Еще раз напоминаю про важность ключа -i. Пока тренируешься - убери, а ключик -e нужен для "расщиренных" регэкспов, но не мешает обычным. Удачи! ;)
 
Короткий и работающий способ, даже если имена файлов содержат пробелы:

Код:
find [COLOR="Blue"]директория с файлами[/COLOR] -iname '[COLOR="Blue"]маска файлов[/COLOR]' -print0 | xargs -0 -n 1 sed -i -e 's/[COLOR="Blue"]исходная строка[/COLOR]/[COLOR="Blue"]требуемая строка[/COLOR]/g'
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху