在vi中搜索和替换控制字符(^ @,^ M,^ I…)


14

我从/proc/some_proc_id/cmdlineubuntu机器上复制了这一行,

java^@-jar^@/usr/lib/selenium/selenium-server-standalone.jar^@-port^@4444^@-trustAllSSLCertificates^@

不知何故,空格字符用^@vi 表示。我尝试使用命令将它们替换为空格字符,

:%s#^@# #g

但是它说pattern not found ^@

如何替换特殊字符,尤其是以克拉符号开头的特殊字符?


您使用的终端类型是什么?
Ed Heal 2015年

有时TERM甚至是很多screen

您正在使用什么终端程序,并且TERM环境变量设置正确?
埃德·赫尔

Answers:


15

不知何故,空格字符用^@vi 表示。

不是vi那样做的。尽管您在外壳程序中键入的命令行在参数之间留有空格,但是命令行实际上是内部字符串的离散序列,而不是一个长的空格分隔的字符串。在启动命令之前,shell将命令行分隔为单独的参数字符串。

在C中,字符串以NUL字符终止,并显示为^@

如何替换特殊字符,尤其是以克拉符号开头的特殊字符?

为了键入这些字符,必须在它们前面加上Control- v以表示原义的下一个字符。

例如,在这种情况下:Control- v后跟Control- @

通常会引入文字下一个字符的特殊字符Control- v但实际上是可配置的。键入stty -a以查找设置为什么。lnext在输出中查找。


该帖子内容丰富。.但是,我的问题的真正解决方案是转义克拉符号- :%s#^@##g。自从我从终端复制粘贴后,vi

1
@MadhavanKumar你不要逃避插入符号符号,因为那里没有插入符号符号。这实际上是一个实际的控制角色。^letter只是视觉符号,不涉及真正的插入符号。是的,您必须转义控制字符,Ctrl-V是您如何从键盘执行此操作。那在任何地方都适用。仅供参考,另一个答案包含特定于vi的命令行的替代方法,以避免完全不必键入控制字符。
Celada's

@MadhavanKumar如果您的终端将NUL字符显示为两个字符的字符串,^@并且您将其复制粘贴,则可使用\^@它在vi中表示该两个字符的字符串。许多软件使用反斜杠来表示“按字面意义解释下一个字符,而不是使用其特殊功能”。
吉尔斯(Gillles)“所以-别再邪恶了”

@Gilles,你是正确的..这就是我想传达给切拉达....

4

符号表示NULL字符,ASCII值为000。

您可以尝试:

:%s/\%x00/ /g

选择:

在键盘上@符号位于2键上方的键盘上(感谢Celada),您可以执行以下操作:

  • %s/<CTRL-2>/ /g (在PC上)

  • %s/<CTRL-SHIFT-2>/ /g (在Mac上)

此处的<CTRL-2>意思是先按下CTRLPC并保持按下,敲击2和释放的状态CTRL

<CTRL-SHIFT-2>表示先按下controlMac上的并保持按下状态,然后按下Mac上的保持按下状态,然后shift按下2,释放controlshift

最后,这两个命令都应显示在%s/^@/ /g屏幕上。^@表示一个字符,^后面没有@,因此您不能只在上面的命令中键入^@连续一行。

此命令^@用空格字符替换所有。

来源


当您说“ PC”时,您是指Windows吗?
Sparhawk

1
CTRL-2和CTRL-SHIFT-2仅在键@位于2键顶部的键盘布局上才有意义。
Celada's

@Sparhawk:不,我的意思是一台Linux PC。:-)
erik

为什么要按CTRL键?我从未见过这样的系统,其中CTRL是用于在键的不同含义之间切换的键。通常是SHIFT。
terdon

这很奇怪(也许是vim中的错误?),但它可以工作。通常应为ctrl + shift + 2(在美国键盘上)。作为一个单独的问题询问,或询问vim开发人员。无论如何,对于控制字符,Celada的答案更为笼统。
erik

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.