40

我正在尝试使用 hexl 模式从文本文件中手动删除一些特殊字符,但看不到如何在 hexl 模式下删除任何内容。

我真正想要的是删除回车并保留换行符。Hexl 模式是正确的方法吗?

4

10 回答 10

93

无需寻找替代品。就用吧。

M-x delete-trailing-whitespace

您还可以通过设置文件编码

C-x RET f unix
于 2010-12-10T05:28:56.143 回答
33

哎呀。^J^M 需要作为两个文字字符输入。使用c-q c-jc-q c-m对于替换字符串,使用c-q c-j.

于 2009-07-23T18:29:19.400 回答
10

为此不需要 hexl-mode。只需用 ^J 对我进行全局搜索和替换 ^J^M 即可。:) 然后保存文件,终止缓冲区,然后重新访问文件,以便窗口显示新的文件模式(Unix vs DOS)。

于 2009-07-23T18:25:29.330 回答
9

还有一个名为unix2dos/dos2unix的命令行工具,专门用于转换行尾。

于 2009-07-27T19:14:49.657 回答
8

假设您希望将 DOS 编码文件更改为 UNIX 编码,请使用 Mx set-buffer-file-coding-system (Cx RET f) 将编码系统设置为“unix”并保存文件。

于 2009-07-28T07:35:29.713 回答
6

如果要删除回车符(通常显示为^M)并保留换行符。您可以访问没有任何转换的文件:

M-x find-file-literally /path/to/file

因为带回车的文件一般在DOS模式下显示(隐藏回车)。模式行可能会显示(DOS)在左侧。

一旦你这样做了,^M就会出现,你可以像删除任何角色一样删除它们。

于 2009-07-23T18:07:31.893 回答
4

您不需要使用十六进制模式。反而:

  • 以向您显示那些 ^M 的方式打开文件。请参阅上面的 Mx find-file-literally /path/to/file。在 XEmacs 中,您还可以执行 Cu Cx Cf 并选择二进制编码。
  • 选择要替换的字符串并使用 Mw 复制它
  • 执行 M-%(查询替换)并使用 Cy 粘贴您要复制的内容
  • 当提示替换它时输入 Enter
  • 可能的新闻!现在替换所有出现

关键是即使您不知道如何输入您要替换的内容,您也可以随时选择/复制它。

于 2009-07-28T00:48:21.907 回答
3

(在十六进制模式下)我不确定您是否可以删除字符。我总是将它们转换为空格或其他字符,切换到常规文本编辑器,然后在那里删除它们。

于 2009-07-23T13:34:53.890 回答
2

我使用这个功能:

(defun l/cr-sanitise ()
  "Make sure current buffer uses unix-utf8 encoding.
If necessary remove superfluous ^M. Buffer will need to be saved
for changes to be permanent."
  (interactive)
    (set-buffer-file-coding-system 'utf-8-unix)
    (delete-trailing-whitespace)
    (message "Please save buffer to persist encoding changes."))
于 2019-12-17T08:36:03.013 回答
1

来自http://www.xsteve.at/prg/emacs/xsteve-functions.el

;02.02.2000
(defun xsteve-remove-control-M ()
  "Remove ^M at end of line in the whole buffer."
  (interactive)
  (save-match-data
    (save-excursion
      (let ((remove-count 0))
        (goto-char (point-min))
        (while (re-search-forward (concat (char-to-string 13) "$") (point-max) t)
          (setq remove-count (+ remove-count 1))
          (replace-match "" nil nil))
        (message (format "%d ^M removed from buffer." remove-count))))))

将此添加到您的.emacs并通过运行它M-x xsteve-remove-control-M或将其绑定到更简单的密钥。它将^M在任何模式下剥离 s。

于 2009-08-12T03:52:09.743 回答