ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Linux, Freebsd, *nix (https://forum.antichat.xyz/forumdisplay.php?f=124)
-   -   Массовая замена в файлах (https://forum.antichat.xyz/showthread.php?t=1791027)

dig555 01.08.2009 16:17

Есть SSH доступ. Есть папка. В ней куча подпапок и файлов.
Задача - найти все файлы, которые называются допустим "myfile.html" (порядка 50 одинаковых файлов, с одинаковым названием), и заменить в них строчку http://site.com/dir/?page=100 на http://another.com/dir2/?page=250

Подскажите, плз, возможно ли это сделать через шелл? Как это должно выглядеть?
Наверное стоит смотреть в сторону sed, вроде как:
sed 's/stringa1/stringa2/g' example.txt replace "string1" with "string2" in example.txt

iva94119255 01.08.2009 18:11

может, использовать ssh-клиента в пакетном режиме (batch mode)?

papenkin 04.08.2009 15:09

Цитата:


dig555 написал(а):

Есть SSH доступ. Есть папка. В ней куча подпапок и файлов.
Задача - найти все файлы, которые называются допустим "myfile.html" (порядка 50 одинаковых файлов, с одинаковым названием), и заменить в них строчку http://site.com/dir/?page=100 на http://another.com/dir2/?page=250
Подскажите, плз, возможно ли это сделать через шелл? Как это должно выглядеть?
Наверное стоит смотреть в сторону 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) и пускаешь. Должно робить.
ЗЫ. Писал из головы, но должно работать. На всякий случай сделай бекап.

dig555 10.08.2009 12:33

Проблемку в тот раз решал всё-таки вручную. Ибо бекап сделать нет возможности. Но задача для меня очень актуальная, и в будущем возможно всплывёт не раз.
Поэтому давайте разберёмся до конца.
Собственно, главный вопрос - можно ли обойтись без баш-скриптинга?
Немножко порыл маны и нашёл конструкцию вроде такой:

Код:


Код:

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'
Скажите, пожалуйста, возможна ли такая команда? И для чего в примере символы



Код:


Код:

{} \;

papenkin 11.08.2009 17:50

Цитата:


dig555 написал(а):

Ибо бекап сделать нет возможности.


Это плохо. Тогда пока тренируешься не ставь ключик -i и файлы останутся не тронутыми, а результат будет валиться на экран. Там и увидишь ошибки, если они есть. Как все отработаешь и убедишься в отсутствии ошибок, пускай с ключем -i
Цитата:


dig555 написал(а):

для чего в примере символы



Код:


Код:

{} \;

фигурные скобки - вместо них будет подставлен результат того что найдет find, а



Код:


Код:

\;
обозначает конец аргументов (обратный слеш - экранизация). Все что находится между ними считается аргументами для команды.
Соответственно, использование этих символов в твоем случае необходимо.

Код:


Код:

find . -name myfile.html -exec sed -i 's#http://site.com/dir/?page=100#http://another.com/dir2/?page=250#g' {} \;
Еще раз напоминаю про важность ключа -i. Пока тренируешься - убери, а ключик -e нужен для "расщиренных" регэкспов, но не мешает обычным. Удачи!

Zharptah 01.11.2009 20:50

Короткий и работающий способ, даже если имена файлов содержат пробелы:

Код:


Код:

find директория с файлами -iname 'маска файлов' -print0 | xargs -0 -n 1 sed -i -e 's/исходная строка/требуемая строка/g'


Время: 03:14