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

Тема в разделе "Десктопный Linux", создана пользователем dig555, 1 авг 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. dig555

    dig555

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

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

    iva94119255 Создатель

    Регистр.:
    18 апр 2009
    Сообщения:
    18
    Симпатии:
    1
    может, использовать ssh-клиента в пакетном режиме (batch mode)?
     
  3. papenkin

    papenkin Создатель

    Регистр.:
    8 май 2008
    Сообщения:
    21
    Симпатии:
    17
    Да, смотреть надо в сторону седа, только из-за наличия "/" в том что ты ищещь/на что меняешь надо изменить синтаксис на такой:
    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 нравится это.
  4. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Проблемку в тот раз решал всё-таки вручную. Ибо бекап сделать нет возможности. Но задача для меня очень актуальная, и в будущем возможно всплывёт не раз.
    Поэтому давайте разберёмся до конца.
    Собственно, главный вопрос - можно ли обойтись без баш-скриптинга?
    Немножко порыл маны и нашёл конструкцию вроде такой:
    Код:
    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'
    Скажите, пожалуйста, возможна ли такая команда? И для чего в примере символы
    Код:
     {} \;
     
  5. papenkin

    papenkin Создатель

    Регистр.:
    8 май 2008
    Сообщения:
    21
    Симпатии:
    17
    Это плохо. Тогда пока тренируешься не ставь ключик -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 нужен для "расщиренных" регэкспов, но не мешает обычным. Удачи! ;)
     
    dig555 нравится это.
  6. Zharptah

    Zharptah Создатель

    Регистр.:
    23 авг 2009
    Сообщения:
    15
    Симпатии:
    4
    Короткий и работающий способ, даже если имена файлов содержат пробелы:

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