我正在使用 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编辑器中,以及在ex和ed(如在 BSD 系统上找到的)中,^地址前一行。这意味着,该命令^d将删除以前的线,^m.将交换与以前这条线,这^,.s/old/new/g将替代匹配的所有字符串old与new上一行,并在这条线。
该vim编辑器,可在伸展重新执行原vi和ex编辑,通常在Linux系统上的名字下安装vim,vi和ex,没有解决前行的这种方式,并且将响应“ E492:不编辑命令”如果你尝试使用它。您可以使用-或-1代替:
-,.s/old/new/g
Run Code Online (Sandbox Code Playgroud)
使用-或-1代替^也能在ed,ex并在vi非GNU系统。
POSIX 标准对与编辑器相关的以下内容进行了说明ed:
从历史上看,
ed接受^字符作为地址,在这种情况下,它与<hyphen-minus>字符相同。POSIX.1-2017 不要求或禁止这种行为。
有一个类似的措辞为vi与ex编辑器(ex是vi “一致的编辑模式”):
从历史上看,
ex并vi接受该^字符作为地址和命令的标志偏移量。在这两种情况下,它都与-角色相同。POSIX.1-2017 不要求或禁止这种行为。
请注意,您似乎引用的文本表示^,.从文件顶部到当前行的所有行。这是不正确的。它只处理前一行和当前行,并且只在vi(andex和 ed) 的“历史准确”实现中这样做。要寻址从编辑缓冲区开头到当前行的所有行,请使用1,..
该^-instead-OF-1错字也可能是从思想来,“既然$是结束线锚在正则表达式,并在编辑缓冲区中的最后一行的地址^,被启动的行的锚因此,正则表达式必须(通过对称)是编辑缓冲区的第一行”。
只是提供另一个琐事:该^地址也不能在ed编辑器的 GNU 实现中使用。与 的任何其他实现一样ed,-或-1仍可用作替代方案。