let i=1 | g/aaa\zs/s//\=i/ | let i=i+1
以上命令在匹配模式后添加计数器编号。因此,以下文字已更改。
aaab
aaab
aaab
到
aaa1b
aaa2b
aaa3b
'|'将命令关联到一个命令中。在我看来,命令按顺序执行,如首先让我= 1 ,然后 g / aaa \ zs / s // \ = i / ,最后让i = i + 1 。从上面的结果中, s // \ = i / **和** let i = i + 1 由 g 命令执行。谁能解释一下? 以下命令执行错误的操作。但我不知道为什么。
let i=1 | g/aaa\zs/s//\=i | let i=i+1
答案 0 :(得分:1)
您应该将第一个命令理解为:
let i=1 | g/aaa\zs/ ( s//\=i/ | let i=i+1 )
(括号仅用于解释,如果键入,它们会导致语法错误)
即g/<pattern/
之后的所有内容都是作为全局g
命令的参数给出的单个命令。
确实如此:我们从let i=1
开始,然后对于匹配模式aaa
的所有行,我们执行:s//\=i/ | let i=i+1
(替换,然后递增i
)。
您的第二个命令不起作用,因为s
的功能与g
的功能不同,并且在表达式替换为模式后需要结束/
。
答案 1 :(得分:1)
在s//\=i/
中,替换字符串终止,|
被全局视为参数。但是,当您删除尾随/
时,s
的替换字符串会消耗| let i=i+1
。从sub-replace-special
的帮助文档中,您可以找到:“当替换字符串以”\ =“开头时,余数被解释为表达式。”因此,计算表达式i | let i=i+1
,但在该评估之外不能使用增量。
答案 2 :(得分:0)
通常,|
分隔两个Ex命令,然后它们确实按顺序执行。但是有些命令会将|
作为参数的一部分。 :global
就是其中之一(:help :bar
完整列表)。因此,命令在匹配行上的特殊应用适用于:s
和:let
命令(后者可以缩短为:let i+=1
BTW)。