如何去掉 CR (^M) 并保留 LF (^J) 字符?

41

我想使用Hexl模式手动从文本文件中删除一些特殊字符,但不知道如何在Hexl模式下删除任何内容。

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

注:Hexl mode(十六进制编辑模式)是GNU Emacs文本编辑器中的一个功能,用于以十六进制格式显示和编辑二进制文件。

1
如果它是一个文本文件...为什么要使用hexl模式? - Trey Jackson
我正在尝试删除回车并保留换行符...别问为什么 - 读取此配置文件的程序需要这样。 - Brandon Leiran
1
+1 我遇到了类似的问题。由于某些奇怪的原因,一些十六进制字符被添加到我的一些文本文件开头。我只想删除这些字符,但在普通缓冲模式下看不到它们。为什么hexl-mode的“删除”功能如此困难? 它一定存在。 - User1
密切相关:https://dev59.com/BHI-5IYBdhLWcg3wf4hD。 - Henke
10个回答

101

不需要查找替换,只需要使用。

M-x delete-trailing-whitespace

你也可以通过以下方式设置文件编码

C-x RET f unix

33

糟糕,那个 ^J^M 需要输入为两个字面字符。 使用 c-q c-jc-q c-m,替换字符串时使用 c-q c-j


我简直不敢相信这里的投票数量如此之少!这对于初学者(或健忘的)Emacs用户来说绝对是个福音! - Ogre Psalm33
2
是的,这应该更高。此外,您可以直接替换^M并忽略^J。 - Ashton Honnecke

10

这个不需要使用hexl-mode。只需全局搜索并替换^J^M为^J即可,对我来说很有效。然后保存文件,杀死缓冲区,重新访问文件以显示新的文件模式(Unix vs DOS)。


2
为什么还要费这个劲呢?按照keysersoze的建议,使用dos2unix和/或unix2dos即可。 - Thomas Owens
不必杀死缓冲区并重新访问文件,您可以单击模式行中的EOL类型指示器以循环浏览不同的选项。这样您就不会丢失您的kill ring。 - phils
1
注明如何实际操作会很有帮助 - M-% 对我来说不起作用。 - baxx

9

8
假设你想将一个DOS编码的文件转换为UNIX编码,使用 M-x set-buffer-file-coding-system (C-x RET f) 命令来设置编码为"unix",然后保存文件即可。

6

如果您想删除回车符(通常显示为^M),并保留换行符。 您只需访问文件而不进行任何转换即可:

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

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

完成后,^M将会显示出来,您可以像删除任何字符一样删除它们。


4
您不需要使用hexl-mode。相反:
  • 以显示那些^M的方式打开文件。参见上面的M-x find-file-literally /path/to/file。在XEmacs中,您还可以执行C-u C-x C-f并选择二进制编码。
  • 选择要替换的字符串并使用M-w复制它
  • 执行M-%(查询替换)并使用C-y粘贴您要复制的内容
  • 在提示要替换为什么时按Enter键
  • 可能现在按!以替换所有出现的内容
重点是即使您不知道如何输入要替换的内容,您也可以始终选择/复制它。

谢谢,我不知道find-file-literally这个工具,实际上它比我一直在使用的hexl模式更适合查看文本文件中的控制字符。 - Marc Stober

3
(在hexl模式下)我不确定您是否可以删除字符。我通常会将它们转换为空格或其他字符,然后切换到普通文本编辑器中删除它们。

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."))

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

1
这是一个很棒的解决方案。一个命令即可立即修复整个文件。 - DOKKA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接