【问题标题】:Applying a set of consecutive regular expressions to multiple files (emacs)将一组连续的正则表达式应用于多个文件(emacs)
【发布时间】:2012-07-21 13:34:56
【问题描述】:

我正在开发一个将几十个 html 文件转换为文本文件的项目,并编写了完成这项工作的替换正则表达式公式。问题是,如何连续应用所有六个,然后对目录中的几十个文件中的每一个都这样做?我已经附加了我的组织解释,其中包括正则表达式,但请记住,这些不是问题;他们做他们的工作(在翻译^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; -> &

【问题讨论】:

    标签: regex emacs replace


    【解决方案1】:
    1. 使用 Dired 打开目录:C-xC-ddirectoryRET
    2. 标记要更改的文件,方法是按 m (dired-mark) 单独标记每个文件,或在菜单栏中的标记菜单中使用其他机制,例如 *.htmlRET (dired-mark-extension) 用html 扩展名标记所有文件。
    3. QregexRETRET (dired-do-query-replace-regexp) 替换 regex 的任何示例一无所有。为此,您可以使用 Ωmega 的正则表达式。
    4. 然后,您可以使用 SPC 替换单个示例,也可以使用 ! 替换所有示例,而无需进一步提问。

    【讨论】:

    • 正是我需要的!唯一的缺点是即使使用“!”它仍然会询问您何时进入下一个文件。因此,在尝试您的答案后,我的一项改进是使用 iBuffer 而不是 Dired,它允许您使用 ibuffer-do-replace-regexp 并因此绕过查询(当然,您必须对您的正则表达式非常有信心)。做到了!谢谢!
    【解决方案2】:

    务实地做到这一点并不难。但惯用的 Emacs 解决方案是录制 2 个键盘宏。

    1. 用replace-regexp 一次性执行每个正则表达式替换 缓冲区。

    2. 在一个dired缓冲区中,

      1. 移动到下一个 html(使用 C-s)
      2. 在其他窗口打开
      3. 在其他窗口中运行 (1) 并切换回 dired 缓冲区。

    然后你会用一个荒谬的数字 C-u1000 或其他东西运行 (2)。

    【讨论】:

    • 好主意。不幸的是,正则表达式足够复杂,以至于我需要拉动它们或使用参考历史命令,这会搞砸宏,因为每次我来的时候历史/池都是不同的。我也收到关于宏长度的错误。也许我需要使用 lisp 脚本来保存命令而不是击键?还是我错过了制作宏的一些东西?
    • 回复:“然后你会用一个荒谬的数字运行 (2)”,请注意,参数 zero 表示重复直到失败。
    • @WorldsEndless 这不是一个过于复杂的宏场景,你绝对不需要 elisp。看看寄存器。
    • 解决历史引用问题的一种方法是将正则表达式保存到特定的寄存器中,在那里它们可以通过不会每次都更改的已知命令可靠地取出。
    【解决方案3】:

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

    这是开始的草稿:

    (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 行,直到覆盖所有表单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2022-06-12
      • 2021-10-23
      • 1970-01-01
      • 2022-09-26
      • 1970-01-01
      相关资源
      最近更新 更多