2012-04-10 90 views
3

我试图用某一列(搜索后)之间的一行代替所有不匹配字符。替换某些列之间的所有不匹配字符


搜索可以是一切
在示例搜索下面= test
的非匹配字符替换字符:空的空间。

我想在第10列和第30列之间替换“test以外的所有字符
列10和30与|

before: djd<aj.testjal.kjetestjaja testlala ratesttsuvtesta !<-a- 
        |     | 
after: djd<aj.test  test  testlala ratesttsuvtesta !<-a- 

我怎么能认识到这一点表示?

+1

我还没有证实这对我自己,但我不认为你可以用正则表达式单独做到这一点。为了排除前10个字符,您将不得不以某种方式与他们进行匹配......一旦匹配,他们就有资格进行替换。我认为你最好把弦分成三部分,进行替换,然后加入片段......但是我希望被证明是错误的。 – 2012-04-10 11:22:24

+0

有时10个字符有时候或多或少的字符。你会如何将绳子分成3块并再次放在一起? – Reman 2012-04-10 12:49:06

+0

如果我严格地呆在vim中,我会简单地添加一个换行符,在那里我想打破这一行,进行替换,然后再次加入该行。如果这是我定期要做的事情,那么我会创建一个可以替换并加入行的宏(确保在加入之后删除多余的空格)。我也喜欢@伯恩哈德的方法,但我从来没有尝试过。 – 2012-04-10 13:13:34

回答

3

在该行上使用以下替换命令。

:s/\(test\)\zs\|\%>9v\%<31v./\=submatch(1)!=''?'':' '/g 

如果使用可视选择指定的列范围,运行

:'<,'>s/\(test\)\zs\|\%V./\=submatch(1)!=''?'':' '/g 
+0

非常感谢。我现在用列解决了所有的事情!只是为了更好地理解,我必须改变做相反的事情。只需在第10行和第30行之间的'test'中替换字母?我只是玩了一下,它移动了'\ zs'并改变了其他的东西,但没有任何工作。非常感谢! – Reman 2012-04-11 12:35:29

+1

对于互补问题,如果预先知道列的范围,请使用命令':%s/\%> 9vtest \%<32v/\ = repeat('',strwidth(submatch(0)))/ g' ;如果该范围用视觉选择指定,则使用':'<,'> s/\%Vtes \%Vt/\ = repeat('',strwidth(submatch(0)))/ g'。 – 2012-04-12 00:55:34

相关问题