将一组连续的正则表达式应用于多个文件(emacs)

时间:2012-07-21 13:34:57

标签: regex emacs replace

我正在开发一个项目,将几十个html文件转换为文本文件,并编写了替换regexp公式来完成这项工作。问题是,如何连续应用所有六个,然后对目录中的每个文件中的每个文件执行此操作?我附上了我的组织解释,包括正则表达式,但请记住,那些不是问题;他们完成自己的工作(在翻译^ J等之后)。问题是如何以编程方式将所有六个应用于目录中的每个(HTML)文件?

* 1. Delete all until >General Conference<
\(.*^J\)*.*?General Conference
* 2. Delete all <p class="copyright"> and after
^.*<p class="copy\(.*^J\)*
* 3. Strip all tags
\(<.*?>\)*
* 4. Remove whitespace lines
^\s-*^J
* 5. Remove ugly numeric identifier
^\s-*[0-9].*^J
* 6. Remove amp 
&amp; -> &

3 个答案:

答案 0 :(得分:4)

  1. 使用Dired打开目录: C-x C-d 目录 RET
  2. 标记要更改的文件,方法是按 m dired-mark)单独标记每个文件,或者在菜单栏的标记菜单中标记其他一些机制,例如< kbd> * html RET dired-mark-extension)标记所有扩展名为html的文件。
  3. Q regex RET RET dired-do-query-replace-regexp)替换的任何示例什么都没有正则表达式。你可以使用Ωmega的正则表达式。
  4. 然后,您可以使用 SPC 或所有示例替换单个示例,而无需使用提出进一步的问题。

答案 1 :(得分:1)

以务实的方式做这件事并不难。但惯用的Emacs解决方案是记录2个键盘宏。

  1. 在单个内容中使用replace-regexp执行每个正则表达式替换 缓冲液中。

  2. 在直接缓冲区中,

    1. 转到下一个html( C-s
    2. 在其他窗口中打开
    3. 在其他窗口中运行(1)并切换回dired缓冲区。
  3. 然后你会以荒谬的数字 C-u 1000 或其他东西运行(2)。

答案 2 :(得分:0)

似乎只是您编写函数并将其应用到文件列表中的一个步骤。

这是一个开始它的草稿:

(defun my-replacements ()
  (interactive "*")
  (save-restriction
    (widen)
    (save-excursion
      (goto-char (point-min))
      (while (re-search-forward "FIRST-REGEXP" nil t 1)
        (replace-match "FIRST-REPLACEMENT"))

重复最后3行直到覆盖所有表格。