如何在VIM中递归地使用全局变量?

3

":g-2-g/3/"这段代码有问题吗?还是全局递归缺失了?我无法理解错误的原因:

E147: 无法进行全局递归

如何在VIM中进行递归全局搜索?

[Neil的初始建议使用操作符\|]

g/1.*2\|2.*1/

一个缺点是组合随着n的增加而扩展。对于三个数字,组合的数量为3!(=6),即
g/1.*2.*3\|2.*1.*3\|3.*1.*2\|1.*3.*2\|2.*3.*1\|3.*2.*1/ 

对于n个数字,组合的数量是n!。

[使用运算符\ &的解决方案]

Brian Carper和Neil Butterworth找到了解决方案。非常感谢他们!

g/.*1\&.*2\&.*3/

这是针对整行的:

g/.*1\&.*2\&.*3\&.*/

1
你的示例程序的目的是什么? - anon
Neil Butterworth:我选择每一行中的2,然后尝试从上一个结果的每一行中选择3。 - Léo Léopold Hertz 준영
难道这不和包含2和3的每一行都是一样的吗? - anon
Neil Butterworth:不会匹配像“234oeu1”和“21”这样的行。如果这个功能在VIM中,我可以通过编写:g=1=g/2/来匹配它们。它会匹配每一行中的1,然后从上次结果中匹配每一行中的2。显然,这是不同的。 - Léo Léopold Hertz 준영
不,尼尔是对的。他并不是说每一行都包含“23”,而是它们在某处包含数字2和3。这与你想要的是相同的。 - rampion
1个回答

3

新信息:这个做你想要的 - "\&" 序列是 "and" 运算符。

g/.*1\&.*2\&.*3/

Brian Carper(参见评论,再次感谢)的解释:

/1\&2/无法工作,因为两个分支都需要在“同一位置”匹配。 /.*1\&.*2/ 使匹配锚定在行首并扩展所需的数量以查找数字。


你如何使用3个数字来实现它?g/1.*2.*3|2.*1.*3|3.*1.*2|1.*3.*2|2.*3.*1|3.*2.*1/ 你能看到组合的数量是n!对于n个数字吗?递归全局搜索只有n个数字的组合。对于n,它只是:g-1-g/2/g@3@...g$n$。这将很酷! - Léo Léopold Hertz 준영
& 可能是你想要的,是的。/1&2/ 不起作用,因为两个分支需要在“相同位置”匹配。/.*1&.*2/ 让匹配锚定在行的前面,然后扩展到找到数字所需的任何数量。 - Brian Carper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接