Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 15:19

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: *замена строки во всех файлах каталога, включая подкаталоги
СообщениеДобавлено: Вс дек 06, 2009 18:24 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
написать тулзу для командной строки, позволяющую делать следующее:
для каждого файла с указанной маской заменить искомую строку на указанную.

replace.exe -m *.f -s " исходная строка" -r " вставляемая строка"

то есть исполнимый файл должен понимать ключи:
-m - маска файла, в котором должны быть произведены замены
-s - строка, которую надо искать и заменить на
-r - строку которую надо вставить вместо искомой
-h - вывод строки подсказки по использованию утилиты

ошибки в командной строке должны ловиться.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс дек 06, 2009 18:36 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
формат маски? :(


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс дек 06, 2009 18:40 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
вопрос писал(а):
формат маски?


а разве не понятно, что это обычная досовая маска имени с ? и * ??

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс дек 06, 2009 18:54 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
формат маски?

стандартный ДОСевый.
То есть
* - любое кол-во символов
? - любой символ

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн дек 07, 2009 00:29 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
это простой конечный автомат
что-то глчит сервис фото
поэтому ссылка на изображение http://www.onlinedisk.ru/view/286439
там начало КА, а продолжение такое же - все состояния идут последовательно и неудача подразумевает выход


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн дек 07, 2009 08:04 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вопрос писал(а):
это простой конечный автомат

ответа не понял. Это задачка для решения.
вопрос писал(а):
там начало КА, а продолжение такое же - все состояния идут последовательно и неудача подразумевает выход

причем тут выход не понятно, программа должна просмотреть содержимое всех файлов и в каждом файле заменить любое количество шаблонных строк на заданную, конец алгоритма когда просмотрены все файлы.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн дек 07, 2009 22:24 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Ага, вот автор задачи не указал, что должна делать задача, если файлов, подходящих к маске нет или что делать, если строка не того формата.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 08, 2009 00:36 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
вопрос писал(а):
Ага, вот автор задачи не указал, что должна делать задача, если файлов, подходящих к маске нет

Ну вероятно ничего. :D
вопрос писал(а):
что делать, если строка не того формата.

mOleg писал(а):
ошибки в командной строке должны ловиться.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 08, 2009 19:05 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Вариант для ннкрона(необходим плагин 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.
Помощь по регулярным выражениям.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *замена строки во всех файлах каталога, включая подкатал
СообщениеДобавлено: Ср дек 09, 2009 11:17 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
mOleg писал(а):
написать тулзу для командной строки, позволяющую делать следующее:
для каждого файла с указанной маской заменить искомую строку на указанную.

replace.exe -m *.f -s " исходная строка" -r " вставляемая строка"


В порядке шутки: решение на юниксевом шелле
cmd=sed -es/исходная/новая/ < {} > .t && mv .t {}
find . -name '*.f' -exec $cmd \;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 09, 2009 15:03 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
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

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB