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

14

我有一个名为COPYING的.txt文件,是在Windows上编辑的。
它包含Windows风格的换行符:

$ 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模式,它可以在单个缓冲区中显示文本及其对应的ASCII值,非常不错。那么如何查找ASCII值不在11-12、40-176范围内(即制表符、空格和可见字符之外的字符)的字符?我尝试创建一个正则表达式进行搜索,但这相当复杂。

3个回答

20
为了查看不可见字符,您可以尝试使用whitespace-mode。空格和制表符将以不同样式的符号显示出来。如果编码系统自动检测为DOS(在状态栏中显示(DOS)),行末的回车符也将被隐藏。运行revert-buffer-with-coding-system以切换到Unix或二进制编码系统(例如C-x RET r unix),它们将始终显示为^M。二进制编码系统还将把任何非ASCII字符显示为控制字符。

所有字符都不会显示为^M。我有一个非常大的文件,我可以看到一些字符是^L。我不知道文件中有多少这样的字符。我想搜索这些字符。 - Talespin_Kit
1
有许多不可见字符在whitespace-mode中无法显示。其中包括:零宽度空格、零宽度非连接符、零宽度连接符、字节顺序标记等等...请看看fingerprinting如何使用它们,以及忽视它们的危险。您可能需要将此反映到您的答案中。 - kotchwane

4

默认情况下,Emacs不会隐藏任何字符。如果先前的方式对手指有些吃力,可以按下Ctrl+Meta+%或者Esc,然后再按下Ctrl+%。如果您更喜欢使用命令,则可以输入M-x replace-regexp RET。接下来,在正则表达式中输入:

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

然而,在我写的地方^H,输入Ctrl+Q,然后再输入Ctrl+H,以实际输入“control-H”字符,其他类似。您可以按Ctrl+Q,然后按Ctrl+Space键来输入^@,通常按Ctrl+Q,然后按Backspace键来输入^?。将正则表达式的所有匹配项替换为空字符串。

由于您在Emacs中打开了文件,因此您可以在更改行尾时同时进行。按下C-x RET fCtrl+X Return F),然后输入us-ascii-unix作为文件的新期望编码。


谢谢你的回答。我想了解正则表达式的作用。我输入了“describe-character-set”命令,然后选择了“ascii”以查看字符集。你能否解释一下为什么你错过了C-j,以及C-?在哪里有文档记录? - Talespin_Kit
@Talespin_Kit C-i 是制表符,C-j 是换行符。 - Gilles 'SO- stop being evil'
这个链接http://www2.lib.uchicago.edu/keith/tcl-course/emacs-tutorial.html说C-m是代表RET键。我找不到C-?的文档,请问你能指出来吗? - Talespin_Kit
@Talespin_Kit 我在手册中没有明确找到这个记录。If <DEL> Fails to Delete 中简要提到了 C-?,字符 127 通常被称为 DEL 字符并由退格或删除键产生。 - Gilles 'SO- stop being evil'

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 list-coding-systems。

因此,从DOS转到UNIX,使用M-x set-buffer-file-coding-system unix


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