Jump to content

  • Log in with Facebook      Sign In   
  • Create Account

Photo

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


  • Please log in to reply
6 replies to this topic

#1 Денис Posted 01 June 2009 - 18:46 PM

Денис
  • Genius loci
  • 6909 posts
  • Денис Сумин
Опять help needed :)

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

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

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

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

#2 KiberGus Posted 01 June 2009 - 19:38 PM

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

#3 Денис Posted 01 June 2009 - 19:41 PM

Денис
  • Genius loci
  • 6909 posts
  • Денис Сумин
Ага, спасибо

#4 Мишаня Posted 01 June 2009 - 19:51 PM

Мишаня
  • Свои
  • 1978 posts
  • Михаил Лебедев
Ты не поверишь, но 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 Мишаня Posted 01 June 2009 - 19:53 PM

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

#6 Денис Posted 01 June 2009 - 19:55 PM

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

#7 Мишаня Posted 01 June 2009 - 20:00 PM

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




2 user(s) are reading this topic

0 members, 2 guests, 0 anonymous users