如何在vim正则表达式中替换或查找不可打印的字符?

Cha*_* Ma 35 regex vim non-printable

我有一个带有一些不可打印字符的文件,它们显示为^ C或^ B,我想找到并替换这些字符,我该怎么做呢?

小智 65

仅删除控制符号:

:%s/[[:cntrl:]]//g
Run Code Online (Sandbox Code Playgroud)

删除不可打印的字符(请注意,在~8.1.1之前的版本中,这也会删除非ASCII字符):

:%s/[^[:print:]]//g
Run Code Online (Sandbox Code Playgroud)

如果您有一些不可打印的非控制字符,例如零宽度空间,则可以看到它们之间的差异:

在此输入图像描述


ars*_*ars 34

假设你想用C代替^ C:

:%s/CtrlVC/C/g

CtrlVC按住时,表示V型,然后是C型Ctrl.

CtrlV 允许您输入控制字符.

  • 您也可以使用Ctrl-Q.这对于将Ctrl-V映射到剪贴板操作的某些用户非常有用 (5认同)

tic*_*ock 10

在vim中保存文件后尝试此操作(假设您在Linux环境中)

:%!tr -cd '[:print:]\n'
Run Code Online (Sandbox Code Playgroud)

  • 请解释这一天节省魔法伏都教! (6认同)
  • @JamesAndino:`:%`使用外部(`!`)programm`tr`过滤所有行,_removes_(`-d`)所有字符_not_(`-c`)_printable_(`[:print:] `)或_newline_(`\n`). (3认同)
  • 这不是Unicode友好的,因为它是POSIX字符类(http://en.wikipedia.org/wiki/Regular_expression#Character_classes).因此,如果你有像你这样的数据的YAML,`tr`将在使用`[:print:]`时删除Unicode数据. (2认同)

Dal*_*lin 6

这里使用Vim的控制字符的答案都不适合我.我不得不进入unicode范围.

:%s/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]//g
Run Code Online (Sandbox Code Playgroud)

在另一篇文章中找到了unicode范围:https://stackoverflow.com/a/8171868/231914


cod*_*ict 5

您可以使用:

:%s/^C//g
Run Code Online (Sandbox Code Playgroud)

为了得到^C按住Ctrl键,按V然后C(两者同时按住Ctrl键),并且^C将出现.这将找到所有出现并替换它们.

要删除这两个^C,^B你可以这样做:

:%s/^C\|^B//g
Run Code Online (Sandbox Code Playgroud)


Pi *_*ort 5

您可以使用CTRL-V前缀输入它们,或者如果它们不容易输入,则使用它们进行拉伸和插入.CTRL-R "


Geb*_*ebb 5

其他答案中未提及的选项。

删除具有长十六进制代码的特定 unicode 字符,例如<200b>

:%s/\%U200b//g
Run Code Online (Sandbox Code Playgroud)