Forth http://fforum.winglion.ru/ |
|
*замена строки во всех файлах каталога, включая подкаталоги http://fforum.winglion.ru/viewtopic.php?f=19&t=2338 |
Страница 1 из 1 |
Автор: | mOleg [ Вс дек 06, 2009 18:24 ] |
Заголовок сообщения: | *замена строки во всех файлах каталога, включая подкаталоги |
написать тулзу для командной строки, позволяющую делать следующее: для каждого файла с указанной маской заменить искомую строку на указанную. replace.exe -m *.f -s " исходная строка" -r " вставляемая строка" то есть исполнимый файл должен понимать ключи: -m - маска файла, в котором должны быть произведены замены -s - строка, которую надо искать и заменить на -r - строку которую надо вставить вместо искомой -h - вывод строки подсказки по использованию утилиты ошибки в командной строке должны ловиться. |
Автор: | вопрос [ Вс дек 06, 2009 18:36 ] |
Заголовок сообщения: | |
формат маски? |
Автор: | WingLion [ Вс дек 06, 2009 18:40 ] |
Заголовок сообщения: | |
вопрос писал(а): формат маски?
а разве не понятно, что это обычная досовая маска имени с ? и * ?? |
Автор: | mOleg [ Вс дек 06, 2009 18:54 ] |
Заголовок сообщения: | |
вопрос писал(а): формат маски?
стандартный ДОСевый. То есть * - любое кол-во символов ? - любой символ |
Автор: | вопрос [ Пн дек 07, 2009 00:29 ] |
Заголовок сообщения: | |
это простой конечный автомат что-то глчит сервис фото поэтому ссылка на изображение http://www.onlinedisk.ru/view/286439 там начало КА, а продолжение такое же - все состояния идут последовательно и неудача подразумевает выход |
Автор: | mOleg [ Пн дек 07, 2009 08:04 ] |
Заголовок сообщения: | |
вопрос писал(а): это простой конечный автомат ответа не понял. Это задачка для решения. вопрос писал(а): там начало КА, а продолжение такое же - все состояния идут последовательно и неудача подразумевает выход
причем тут выход не понятно, программа должна просмотреть содержимое всех файлов и в каждом файле заменить любое количество шаблонных строк на заданную, конец алгоритма когда просмотрены все файлы. |
Автор: | вопрос [ Пн дек 07, 2009 22:24 ] |
Заголовок сообщения: | |
Ага, вот автор задачи не указал, что должна делать задача, если файлов, подходящих к маске нет или что делать, если строка не того формата. |
Автор: | VoidVolker [ Вт дек 08, 2009 00:36 ] |
Заголовок сообщения: | |
вопрос писал(а): Ага, вот автор задачи не указал, что должна делать задача, если файлов, подходящих к маске нет Ну вероятно ничего. вопрос писал(а): что делать, если строка не того формата. mOleg писал(а): ошибки в командной строке должны ловиться.
|
Автор: | VoidVolker [ Вт дек 08, 2009 19:05 ] |
Заголовок сообщения: | |
Вариант для ннкрона(необходим плагин Autostrings.spf): Код: \ Файл: replace.spf \ Автор: VoidVolker \ Дата: 08/12/2009 17:21 \ Версия: 3.00, версия ннКрона 1.91.1083 \ Описание: \ Утилита для командной строки, позволяющая для каждого файла с указанной маской заменить искомую строку на указанную. \ Инструкция пользователя: \ -p "path"- путь к каталогу, в котором должны искаться файлы для замены строк \ (наличие слеша в конце обязательно, иначе будет считаться частью маски); \ -m "*.*" - маска или \ -m "/regexp/" - регулярное выражение, идентифицирующее файл в котором должны быть произведены замены; \ -rec - работать с подкаталогами(по умолчанию); \ -norec - не работать с подкаталогами; \ -s "строка1"- искомая строка, которую надо искать и заменить; \ -r "строка2" - строку которую надо вставить вместо искомой; \ -h - вывод подсказки по использованию утилиты. \ Поддерживаются следующие эскейп-последовательности: \ // -> / \ /p -> % \ /q -> " \ /t -> <табуляция> 9 \ /v -> <вертикальная табуляция> 0xB \ /r -> <возврат картеки> 0xD \ /n -> <перевод строки> crlf 0x0D0A REQUIRE AUTOSTRINGS-MODULE plugins\Autostrings.spf \ http://www.nncron.ru/forums/viewtopic.php?f=5&t=10296#p23848 : StringReplace { a1 u1 a2 u2 a3 u3 \ rest a4 u4 buf -- a u } \ Заменить в строке 1 подстроку 2 на строку 3, на стеке останется измененая строка AT buf TO a4 a1 u1 BEGIN OVER SWAP a2 u2 SEARCH WHILE TO rest SWAP 2DUP - a4 u4 2SWAP S+ TO u4 TO a4 a3 u3 a4 u4 2SWAP S+ TO u4 TO a4 rest u2 /STRING REPEAT a4 u4 2SWAP S+ ROT DROP ; VECT <vp> VECT <vs> VECT <vr> VECT <vm> VARIABLE ready? : S"" S" " ; : *mask S" *" ; : init ['] ModuleDirName TO <vp> ['] S"" TO <vs> ['] S"" TO <vr> ['] *mask TO <vm> ready? OFF RECURSIVE ; : get-str BL SKIP [CHAR] " SKIP BL SKIP [COMPILE] " ; IMMEDIATE : :str :NONAME [COMPILE] get-str [COMPILE] ; ; : is-regexp? \ ( a u -- ? ) OVER C@ [CHAR] / = SWAP ROT + 1- C@ [CHAR] / = OR ; CREATE "help 1500 ALLOT S"" " Инструкция пользователя:/n -p /qpath/q - путь к каталогу, в котором должны искаться файлы для замены строк/n" S+ " (наличие слеша в конце обязательно, иначе будет считаться частью маски);/n" S+ " -m /q*.*/q - маска или/n" S+ " -m /q//regexp///q - регулярное выражение, идентифицирующее файл в котором должны быть произведены замены;/n" S+ " -rec - работать с подкаталогами(по умолчанию);/n" S+ " -norec - не работать с подкаталогами;/n" S+ " -s /qстрока1/q - искомая строка, которую надо искать и заменить;/n" S+ " -r /qстрока2/q - строку которую надо вставить вместо искомой;/n" S+ " -h - вывод подсказки по использованию утилиты;/n" S+ " Поддерживаются следующие эскейп-последовательности:/n" S+ " //// -> ///n" S+ " //p -> /p/n" S+ " //q -> /q/n" S+ " //t -> <табуляция> 9/n" S+ " //v -> <вертикальная табуляция> 0xB/n" S+ " //r -> <возврат картеки> 0xD/n" S+ " //n -> crlf 0x0D0A/n" S+ SWAP OVER "help SWAP CMOVE \ len : -h \ ( -- ) "help LITERAL MsgBox ; : replace-in-files \ ( -- ) FILESONLY <vm> is-regexp? IF <vp> S" *" S+ FOR-FILES FOUND-FULLPATH <vm> RE-MATCH IF FOUND-FULLPATH FILE <vs> <vr> StringReplace FOUND-FULLPATH FWRITE THEN ;FOR-FILES ELSE <vp> <vm> S+ FOR-FILES FOUND-FULLPATH FILE <vs> <vr> StringReplace FOUND-FULLPATH FWRITE ;FOR-FILES THEN ; : -p \ ( " path" -> ) :str TO <vp> ; : -s \ ( " искомая строка" -> ) :str TO <vs> ready? @ IF replace-in-files ready? OFF THEN ready? ON ; : -r \ ( " вставляемая строка" -> ) :str TO <vr> ready? @ IF replace-in-files ready? OFF THEN ready? ON ; : -m \ ( " mask|regexp" -> ) :str TO <vm> ; : -rec \ ( -- ) FF-RECURSIVE? ON ; : -norec \ ( -- ) FF-RECURSIVE? OFF ; WARNING @ WARNING OFF : NOTFOUND ( a u -- ) 2DUP 2>R ['] NOTFOUND CATCH IF 2DROP " Ошибка в строке:/n%SOURCE%" MsgBox BYE THEN RDROP RDROP ; WARNING ! ' init MAINX ! S" replace.exe" SAVE BYE Для компиляции ехе в кроне скормить этот файл в командной строке ннкрону: Код: nncron.exe replace.spf
Предварительно положив в каталог plugins файл Autostrings.spf. Помощь по регулярным выражениям. |
Автор: | dynamic-wind [ Ср дек 09, 2009 11:17 ] |
Заголовок сообщения: | Re: *замена строки во всех файлах каталога, включая подкатал |
mOleg писал(а): написать тулзу для командной строки, позволяющую делать следующее:
для каждого файла с указанной маской заменить искомую строку на указанную. replace.exe -m *.f -s " исходная строка" -r " вставляемая строка" В порядке шутки: решение на юниксевом шелле cmd=sed -es/исходная/новая/ < {} > .t && mv .t {} find . -name '*.f' -exec $cmd \; |
Автор: | VoidVolker [ Ср дек 09, 2009 15:03 ] |
Заголовок сообщения: | |
dynamic-wind писал(а): В порядке шутки: решение на юниксевом шелле
cmd=sed -es/исходная/новая/ < {} > .t && mv .t {} find . -name '*.f' -exec $cmd \; А в ннкроне аналогично: для такой замены в задаче достаточно одного лишь цикла FOR-FILES. У меня такой объем решения объясняется лишь оберткой этого цикла для соотвветствию ТЗ. А фактически можно прямо в командной строке: Код: nncron.exe : replace FOR-FILES: "path\*.f" FOUND-FULLPATH FILE S" исходная строка" S" вставляемая строка" StringReplace FOUND-FULLPATH FWRITE ;FOR-FILES ; replace
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |