Перейти к содержимому


Фото

Массовая замена подстроки


  • Чтобы отвечать, сперва войдите на форум
6 ответов в теме

#1 Денис Опубликовано 01 Июнь 2009 - 18:46

Денис
  • Genius loci
  • 6 898 Сообщений:
  • Денис Сумин
Опять help needed :)

Подозреваю, что мог бы и сам разобраться, но предполагаю, что проблема и решение известны :)
Возможно просто ткнуть носом в man/faq/how-to или что-то в этом духе.

Итак, есть папка с файлами. Файлов много, в каждом надо заменить подстроку A на подстроку B.
Задача — заставить сделать это машину :)
Решать под windows|linux мне все равно, но, думаю, проще что-то такое под линуксом написать :-)

Усложнение задачи.
Просмотреть еще и все подпапки, где так же есть файлы. Причем на разных уровнях вложенности выводить вместо A разное количество "../" перед B.

Заранее спасибо :)

#2 KiberGus Опубликовано 01 Июнь 2009 - 19:38

KiberGus
  • Genius loci
  • 6 561 Сообщений:
  • Алексей Гусейнов
Замену можно делать утилитой sed. Обходить фалйы можно утилитой find или скриптом на bash. В последнем случае можно еще и рекурсию замутить с изменением строки.
Зато, обладая единственной в мире подводной орбитальной группировкой спутников глонасс...
gentoo.gif

#3 Денис Опубликовано 01 Июнь 2009 - 19:41

Денис
  • Genius loci
  • 6 898 Сообщений:
  • Денис Сумин
Ага, спасибо

#4 Мишаня Опубликовано 01 Июнь 2009 - 19:51

Мишаня
  • Свои
  • 1 978 Сообщений:
  • Михаил Лебедев
Ты не поверишь, но opennet.ru по запросу "replace" выдаёт нужный результат! =)
replace A B -- ./*

Альтернативный вариант, с сохранением исходных файлов (я не проверял, но должно работать):
awk '{gsub("A_pattern", "B_pattern"); print > FILENAME+".replaced"}' ./*

С усложнением задачи сам разбирайся. Мне кажется, тут точно надо awk использовать. Там, например, можешь сделать
awk 'BEGIN{n=length(split(FILENAME, "/")); for(i=0;i<n;i++) B_pattern= "../"+B_pattern} <дальше то же, что указано выше>, и обратиться к рекурсивно по директориям полученному списку файлов, без указания собственно директорий.
Пока писал, сообразил, что наверняка можно проще.

Вообще если ты хочешь нормально консолью в иксах пользоваться, без awk не обойтись.
Я спасу розовый попник!

#5 Мишаня Опубликовано 01 Июнь 2009 - 19:53

Мишаня
  • Свои
  • 1 978 Сообщений:
  • Михаил Лебедев
А вообще Лёха, как водится, прав, и здесь явно проще что-нибудь на bash накатать.
Я спасу розовый попник!

#6 Денис Опубликовано 01 Июнь 2009 - 19:55

Денис
  • Genius loci
  • 6 898 Сообщений:
  • Денис Сумин
Интересно. Попробую разобраться :) upd: да, на bash, наверное, проще )

#7 Мишаня Опубликовано 01 Июнь 2009 - 20:00

Мишаня
  • Свои
  • 1 978 Сообщений:
  • Михаил Лебедев
Проще-то проще, но bash не обладает и десятой долей всей красоты и мощи awk! =)))
Я спасу розовый попник!




0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 невидимых