Опять help needed
Подозреваю, что мог бы и сам разобраться, но предполагаю, что проблема и решение известны
Возможно просто ткнуть носом в man/faq/how-to или что-то в этом духе.
Итак, есть папка с файлами. Файлов много, в каждом надо заменить подстроку A на подстроку B.
Задача — заставить сделать это машину
Решать под windows|linux мне все равно, но, думаю, проще что-то такое под линуксом написать :-)
Усложнение задачи.
Просмотреть еще и все подпапки, где так же есть файлы. Причем на разных уровнях вложенности выводить вместо A разное количество "../" перед B.
Заранее спасибо
Массовая замена подстроки
Started By
Денис
, июн 01 2009 18:46
6 ответов в теме
#1 Опубликовано 01 Июнь 2009 - 18:46
#2 Опубликовано 01 Июнь 2009 - 19:38
Замену можно делать утилитой sed. Обходить фалйы можно утилитой find или скриптом на bash. В последнем случае можно еще и рекурсию замутить с изменением строки.
Зато, обладая единственной в мире подводной орбитальной группировкой спутников глонасс...
#3 Опубликовано 01 Июнь 2009 - 19:41
Ага, спасибо
#4 Опубликовано 01 Июнь 2009 - 19:51
Ты не поверишь, но 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 не обойтись.
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
А вообще Лёха, как водится, прав, и здесь явно проще что-нибудь на bash накатать.
Я спасу розовый попник!
#6 Опубликовано 01 Июнь 2009 - 19:55
Интересно. Попробую разобраться
upd: да, на bash, наверное, проще )
#7 Опубликовано 01 Июнь 2009 - 20:00
Проще-то проще, но bash не обладает и десятой долей всей красоты и мощи awk! =)))
Я спасу розовый попник!
0 пользователей читают эту тему
0 пользователей, 0 гостей, 0 невидимых