Как сделать массовое редактирование файлов в обычном lisp? - PullRequest
4 голосов
/ 12 марта 2012

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

Я использовал следующее:

find -name '*.lisp' -execdir perl -0777 -pi.bak -e 's/foo/bar/mi' '{}' '+'

, и оно сработало как шарм.

ВышеКоманда подает все файлы в каталоге (и его подкаталогах) в Perl-программу.Программа perl ищет регулярное выражение «foo» и заменяет его регулярным выражением «bar», а затем сохраняет новый (отредактированный) файл на месте.

Спасибо за любые рекомендации, которые вы можете предоставить в решении CL.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2012

Как начать с walk-directory , slurp файл , закрыть файл , заменить foo with bar, запишите содержимое обратно, а затем ... отдохните. ; -)

1 голос
/ 13 апреля 2012

Вместо perl вы можете использовать sbcl --noinform --quit --eval.

Что касается содержимого скрипта, примерно так должно работать:

(progn
  (require :cl-ppcre)

  (let* ((file (nth 4 *posix-argv*))
         (buf (make-array (file-length file)
                          :element-type 'character :adjustable t :fill-pointer t)))
    (setf (fill-pointer buf) (with-open-file (in file)
                               (read-sequence buf in)))
    (princ (ppcre:regex-replace-all "foo" buf "bar"))))

Или, если вы можете кормить файл построчно:

(progn
  (require :cl-ppcre)
  (princ (ppcre:regex-replace-all "foo" (read-line) "bar")))
...