Emacs Regex replacement



在我的乳胶文件中,我定义了

newcommand{replace}[2]{textcolor{red}{sout{#1} }textcolor{blue}{{#2}}}

只是为了突出变化。所以在我的论文草稿中,有很多出现

replace{old text}{new text}

现在论文被接受,我想得到一个干净的版本。如何使用 emacs 正则表达式替换将它们全部更改为

new text

一个非常简单的方法是修改替换命令,使其仅打印新文本:

newcommand{replace}[2]{#2}

否则,我将使用如下所示的键盘宏执行此操作:

C-s           ;; isearch-forward
             ;; self-insert-command
replace{      ;; self-insert-command * 8
RET           ;; newline
<left>        ;; backward-char
ESC <C-right> ;; forward-sexp
C-SPC         ;; set-mark-command
C-r           ;; isearch-backward
             ;; self-insert-command
replace       ;; self-insert-command * 7
RET           ;; newline
C-w           ;; kill-region
2*C-SPC       ;; set-mark-command
ESC <C-right> ;; forward-sexp
DEL           ;; delete-backward-char
C-u C-SPC     ;; set-mark-command
C-d           ;; delete-char

此键盘宏背后的逻辑是搜索replace{命令,然后使用 forward-sexpbackward-sexp 在平衡的"大括号"对之间移动。

编辑:请注意,forward-sexp的绑定传统上写为 C-M-,但这样的按键可能会被窗口管理器拦截(至少在 Linux 盒子中这是非常常见的行为)。因此,键入 ESCC-通常更容易。

我会使用以下模式使用命令query-replace-regexpM-x query-replace-regexpC-M-%):

\replace{.+?}{(.+?)}

和以下替换字符串:

1

请注意大括号内的问号,这使搜索变得懒惰(非贪婪),这意味着它匹配的字符尽可能少。

最新更新