Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Массовая замена строки во всех файлах с расширением *.html  (Прочитано 1867 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн zorgingyaringen

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Помогите пожалуйста решить проблему.

Задача: в определенных каталогах во всех файлах с расширением *.html сделать замену строки phpif на php if.
Ранее сделал бы это так: find -type f -name \*.html -exec sed -i -r 's/phpif/php if/g' {} \;
Но по скольку замену надо сделать только в определенных каталогах по списку, не знаю как написать скрипт. Чтобы скрипт брал имена каталогов из файла katalog.txt и дела замену только в них.

Оффлайн SkinnyJack

  • Любитель
  • *
  • Сообщений: 53
    • Просмотр профиля
Код: (bash) [Выделить]
#!/bin/bash
parent=$(pwd)
for d in $(cat katalog.txt)
do
    cd $d
    ...
    cd $parent
done
Оно?

Оффлайн БТР

  • Заслуженный пользователь
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6294
    • Просмотр профиля
Код: (bash) [Выделить]
for d in `cat katalog.txt`; do sed <тут пишем что надо> $d/*.html; done
P.S. щас придёт Azure и покажет класс  :D

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
БТР, 8) ну у Вас норм, только я б использовал лучше while :P
Код: (bash) [Выделить]
while read d ; do sed -ri 's/phpif/php if/g' $d/*.html 2>/dev/null ; done < katalog.txtХотя можно и ТС findом
Код: (bash) [Выделить]
find $(<katalog.txt) -type f -name \*.html -exec sed -i 's/phpif/php if/g' {} +
« Последнее редактирование: 14 Апреля 2015, 19:58:35 от Azure »
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
find ./ -type f -name "*.html" | xargs -I {} sed -i -r 's/phpif/php if/g' -i {}
Wars ~.o

Оффлайн zorgingyaringen

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Ребят спасибо огромное что отреагировали и помогли !
Всё работает отлично !
Если можно подскажите еще момент. Как правильно запустить этот sh скрипт через cron ?
не хочет и все тут. пробовал скрипт лежи в этом каталоге /var/www/www-data/data/www/zamena.sh
в крон пробовал прописывать такую команду bash /bin/bash /var/www/www-data/data/www/zamena.sh  не запускается.
пока запускал решение от SkinnyJack

#!/bin/bash
parent=$(pwd)
for d in $(cat file.txt)
do
    cd $d
    find -type f -name \*.html -exec sed -i -r 's/phpif/php if/g' {} \;
    cd $parent
done

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Два мелких замечания: в file.txt должны быть полные пути, тогда
Код: (bash) [Выделить]
#!/bin/bash
for d in $(<file.txt)
do
    find $d -type f -name \*.html -exec sed -i 's/phpif/php if/g' {} +
done
( в таком случае и цикл не имеет смысла — сразу можно подставлять в find $(<file.txt)… )
Далееchmod +x /var/www/www-data/data/www/zamena.shИ в крон команда /var/www/www-data/data/www/zamena.sh
« Последнее редактирование: 15 Апреля 2015, 00:32:51 от Azure »
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн БТР

  • Заслуженный пользователь
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6294
    • Просмотр профиля
я б использовал лучше while

почему while тут предпочтительнее?

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
БТР,
Больше вопрос личных предпочтений, единственно, проще решать вопрос с пробелами в названиях.
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.018 секунд. Запросов: 21.