在VIM中执行多个%s命令总是给我错误E488:尾随字符

时间:2014-12-04 00:33:35

标签: vim

我知道我们对此有很多问题(和答案),但直到现在我无法解决我的问题。我只需要在同一行中执行这些命令(和其他命令):

%s/request_snapshot\zs\s*=\s*true/ = false
%s/primary_dev\zs\s*=\s*"[^"]*"/ = "vnic"

我已经尝试过:

%s/request_snapshot\zs\s*=\s*true/ = false | %s/primary_dev\zs\s*=\s*"[^"]*"/ = "vnic"
%s#request_snapshot\zs\s*=\s*true# = false | %s#primary_dev\zs\s*=\s*"[^"]*"# = "vnic"
%s#request_snapshot\zs\s*=\s*true# = false \| %s#primary_dev\zs\s*=\s*"[^"]*"# = "vnic"
什么也没有。一个非常好的答案是不用担心替换" /"由任何其他角色,因为我需要执行许多命令,这将是非常痛苦的。

2 个答案:

答案 0 :(得分:3)

最简单的解决方案是创建一个函数然后调用该函数。因为您可以将每个替换命令放在自己的行上。

如果你真的想要链接它们,你必须终止替换命令。

%s/request_snapshot\zs\s*=\s*true/ = false/

在每个替换的末尾加上一个斜杠(分隔符)。

所以

%s/request_snapshot\zs\s*=\s*true/ = false/ | %s/primary_dev\zs\s*=\s*"[^"]*"/ = "vnic"
                                          ^

将是可以链接的有效替换。

原始人认为它具有尾随字符的原因是管道不会结束替换。 %s结束替换后的斜杠。并且primary_dev\zs\s*=\s*"[^"]*"/ = "vnic"不构成有效标记。

答案 1 :(得分:3)

单个替换命令不需要最后一个分隔符(通常是斜杠,/),因为可以假设它。当您使用|执行多个命令时,您需要确保拥有最终的分隔符。

:%s/foo/bar
:%s/hello/world

会变成:

:%s/foo/bar/e | %s/hello/world/e

注意:我还添加了e标志,如果没有发生替换,它会抑制错误,因为这会停止管道。

所以你的最终命令如下:

%s/request_snapshot\zs\s*=\s*true/ = false/e | %s/primary_dev\zs\s*=\s*"[^"]*"/ = "vnic"/e