Найти и заменить

Тема в разделе "Десктопный Linux", создана пользователем typus, 8 янв 2011.

Модераторы: Цукер
  1. typus

    typus

    Регистр.:
    25 июл 2007
    Сообщения:
    640
    Симпатии:
    154
    Приветствую, есть два сайта-зеркала,скажем, mysite.ru и mysite.com, синроню через rsync, но вот есть одна засада.
    Есть одна папка, включает в себя подпапки, исключать из синхронизации нельзя, так как изменения происходят довольно существенные.
    Итак, в этих подпапках внутри основной папки находятся по одному или несколько xml-файлов, которые изменяются, но кроме всего прочего, они содержат несколько строк - путей соответственно с полными урлами. Таким образом, после синхронизации соотвественно косяки из за этих урлов.
    Таким образом, хочу красивый скрипт, который бы искал в исходной папке рекурсивно по всем подпакам строки с одними урлами и заменял эти урлы на другие...
    Все вроде просто, find и sed все делают. Осталось только до ума довести.
    Например, команда вида
    Код:
    find "корневая_папка_для_поиска" -name "*.xml" -print0 | xargs -0 sed -i -e "s/текст_для_поиска/заменяем_на/g"
    все делает, но при этом копирует все исходные файлы - до вснесения в них изменений и кладет их рядом с добавлением -е в конец имени файла. А мне не нужны двойные файлы, зачем они?
    Если же опцию е не применять, то не срабатывает, выходит ошибка типа
    Код:
    sed: 1: "/home/wins/skin/me ...": undefined label 'im/skin/media/xml/media.xml'
    И еще, хотелось бы иметь лог, желательно такой: после того, как find нашел данные вхождения, записался бы лог где, в каких файлах что было найдено, после замены - соответственно что стало. Вроде как grep тут нужен, но чет я не соображу, как правильно и все оформить, одним красивым скриптом.
    Если у кого есть мысли, помогайте, плз.
     
  2. ask0n

    ask0n

    Регистр.:
    9 июн 2009
    Сообщения:
    227
    Симпатии:
    63
    Можно попробовать сразу через find делать:

    Код:
    find "корневая_папка_для_поиска" -name "*.xml" -type f -exec sed -i -e 's/текст_для_поиска/заменяем_на/g' {} \;
     
  3. typus

    typus

    Регистр.:
    25 июл 2007
    Сообщения:
    640
    Симпатии:
    154
    Конечно же через find, как же еще...
    в общем то, уже нашел все решения,с помощью конечно, ну и причины ошибок. Ошибка выше была только во freebsd, и решилась добавлением между параметрами i и e пары пустых двойных кавычек. Я сильно не вдавался, почему на фре так, заработало как надо и ладно. А под линуксом и так все нормально отрабатывало.
    в принципе, даже скрипт небольшой помогли мне написать, может немного корявый, но работает быстро и лог пишет.
    Код:
    #!/bin/sh
    LOGFILE=/home/typus/sed1.log
    cp /dev/null $LOGFILE
    for a in $( find "корневая_папка_для_поиска" -name "*.xml" ); do
    	sed -i "" -e "/ст/ sтекст_для_поиска//заменяем_на/gwsed.log" $a
    	c=`wc -l < sed.log`
    	if [ $c != 0 ]; then
    		echo "Найдено и изменено в $a - $c значений"
    		echo "Найдено и изменено в $a - $c значений"  1>>$LOGFILE 
    	fi
    done
    rm sed.log