如何使用emacs查找和删除文本文件中的不可见字符

时间:2011-10-07 12:54:47

标签: emacs

我有一个名为COPYING的txt文件,它在Windows上编辑。它包含windows风格的eol

$ file COPYING 
COPYING: ASCII English text, with CRLF line terminators

我尝试使用dos2unix将其转换为unix样式。以下是输出

$ dos2unix COPYING 
dos2unix: Skipping binary file COPYING

我很惊讶地发现dos2unix程序将其报告为二进制文件。然后使用其他编辑器(不是emacs),我发现该文件包含一个控制字符。我有兴趣使用emacs找到文件中的所有不可见字符。

通过谷歌搜索,我找到了以下使用tr

的解决方案
tr -cd '\11\12\40-\176' < file_name

如何以emacs的方式做同样的事情。我尝试了hexl模式。 hexl模式在单个缓冲区中显示文本及其相应的ascii值,这很好。如何查找ASCII值不是11-12,40-176的字符(即制表符,空格和可见字符)。我试图为该搜索创建一个正则表达式,但它非常复杂。

3 个答案:

答案 0 :(得分:13)

要查看隐身字符,您可以尝试whitespace-mode。将显示空格和制表符,并在不同的面中显示符号。如果编码系统被自动检测为dos(在状态栏上显示(DOS)),则也会隐藏行尾的回车符。运行revert-buffer-with-coding-system将其切换为Unix或二进制(例如 C-x RET r unix ),它们将始终显示为^M。二进制编码系统也会将任何非ASCII字符显示为控制字符。

答案 1 :(得分:3)

默认情况下,Emacs不会隐藏任何字符。按 Ctrl + Meta + ,或 Esc 然后 Ctrl + 如果前者手指太硬,或M-x replace-regexp RET如果您愿意。然后,对于正则表达式,输入

[^@-^H^K-^_^?]

但是,在我写^H的地方,输入 Ctrl + Q 然后 Ctrl + H ,从字面上输入“控制-H”字符,对其他人来说同样如此。您可以按 Ctrl + Q 然后按 Ctrl + 空格获取^@,通常 Ctrl {/ kbd> + Q 然后 Backspace ^?。用空字符串替换所有出现的正则表达式。

由于您已在Emacs中打开文件,因此您可以在使用时更改其行结尾。按C-x RET f Ctrl + X 返回 F )并输入us-ascii-unix作为文件的新所需编码。

答案 2 :(得分:1)

结帐M-x set-buffer-file-coding-system。来自文档:

  

(set-buffer-file-coding-system CODING-SYSTEM &optional FORCE NOMODIFY)

     

将当前缓冲区的文件编码系统设置为CODING-SYSTEM。   这意味着当您保存缓冲区时,它将被转换   根据CODING-SYSTEM。有关可能值的列表   CODING-SYSTEM,使用M-x列表编码系统。

所以,从DOS到UNIX,M-x set-buffer-file-coding-system unix