在 vi 编辑器的替换中使用插入符号 (^)

use*_*343 5 editors vi

我正在使用 CentOS,并且正在阅读有关编辑器中的替换命令 ,s///的信息vi。我想测试一些我看到的例子:

:%s/old/new/g     Substitutes old with new throughout the file
:.,$s/old/new/g   Substitutes old with new from the current cursor position to the end of the file
Run Code Online (Sandbox Code Playgroud)

上面的示例对我来说按预期工作,但以下包含插入符号 ( ^) 的示例不起作用:

 :^,.s/old/new/g   Substitutes old with new from the beginning of the file to the current cursor position
Run Code Online (Sandbox Code Playgroud)

我试过了,但没有用,所以插入符号不起作用还是我输入的命令不正确?

Kus*_*nda 15

vi编辑器中,以及在exed(如在 BSD 系统上找到的)中,^地址前一行。这意味着,该命令^d将删除以前的线,^m.将交换与以前这条线,这^,.s/old/new/g将替代匹配的所有字符串oldnew上一行,并在这条线。

vim编辑器,可在伸展重新执行原viex编辑,通常在Linux系统上的名字下安装vimviex,没有解决前行的这种方式,并且将响应“ E492:不编辑命令”如果你尝试使用它。您可以使用--1代替:

-,.s/old/new/g
Run Code Online (Sandbox Code Playgroud)

使用--1代替^也能在edex并在vi非GNU系统。

POSIX 标准对与编辑器相关的以下内容进行了说明ed

从历史上看,ed接受^字符作为地址,在这种情况下,它与<hyphen-minus>字符相同。POSIX.1-2017 不要求或禁止这种行为。

有一个类似的措辞viex编辑器(exvi “一致的编辑模式”):

从历史上看,exvi接受该^字符作为地址和命令的标志偏移量。在这两种情况下,它都与-角色相同。POSIX.1-2017 不要求或禁止这种行为。

请注意,您似乎引用的文本表示^,.从文件顶部到当前行的所有行。这是不正确的。它只处理前一行和当前行,并且只在vi(andexed) 的“历史准确”实现中这样做。要寻址从编辑缓冲区开头到当前行的所有行,请使用1,..

^-instead-OF-1错字也可能是从思想来,“既然$是结束线锚在正则表达式,并在编辑缓冲区中的最后一行的地址^,被启动的行的锚因此,正则表达式必须(通过对称)是编辑缓冲区的第一行”。

只是提供另一个琐事:该^地址也不能在ed编辑器的 GNU 实现中使用。与 的任何其他实现一样ed--1仍可用作替代方案。