在Emacs中用句子后将一个空格替换为两个

时间:2017-04-14 10:30:23

标签: regex replace emacs

我有一个带有段落的文档,其中一些句子以点和一个空格(". Nextline")结尾,而其他句子以点和两个空格(". Nextline")结尾。我想将替换点和一个空格替换为点和两个空格,但不增加现有点和两个空格点和三个空格。

段落的句子不是以换行符或“\ n”结尾,除了最后一句。该段末尾将有一个换行符。我想用2个空格开始每个句子,既不是1也不是3或更多。如果我在菜单中使用搜索和替换,则以2个空格开头的句子在其开头增加到3个空格。

我该怎么做?我试过跟随,但它增加了两个空格到三个:

(defun space12 ()
    (interactive)
    (while (re-search-forward "\\. ?" nil t)
        (replace-match ".  ")))

问题在哪里,我该如何纠正?

示例输入文字:

This is first sentence (I called it line earlier). This sentence has one space at start.  This has two. And this again has one space at start.

2 个答案:

答案 0 :(得分:2)

repunctuate-sentences

Put two spaces at the end of sentences from point to the end of buffer.

It works using query-replace-regexp.
If optional argument NO-QUERY is non-nil, make changes without asking for confirmation.

这相当简单,只需将 query-replace-regexp 与正则表达式:\\([]\"')]?\\)\\([.?!]\\)\\([]\"')]?\\) + 一起使用,但是您可以根据需要依次决定每个选项,这对于误报很有用(例如“即").

答案 1 :(得分:0)

您可以将C-M-%M-x query-replace-regexp)与搜索字符串\. \([^ ]\)和替换字符串. \1一起使用。

如果您想将\放入字符串中,请记住您必须使用其他\转义它。例如:

(defun space12 ()
  (interactive)
  (while (re-search-forward "\\. \\([^ ]\\)" nil t)
    (replace-match ".  \\1" t)))

为了让这个“表现得很好”,我会让它始终处理整个缓冲区,然后回到原来的位置:

(defun space12 ()
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "\\. \\([^ ]\\)" nil t)
      (replace-match ".  \\1" t))))