Regex 替换某些列之间的所有不匹配字符

Regex 替换某些列之间的所有不匹配字符,regex,search,vim,pattern-matching,substitution,Regex,Search,Vim,Pattern Matching,Substitution,我试图在某些列之间的单行中替换所有不匹配的字符(搜索后) 示例: 搜索可以是所有内容 在下面的示例中,搜索=测试 非匹配字符的替换字符:空格 我想替换第10列和第30列之间“test”的所有非部分字符。 第10列和第30列用| before: djd<aj.testjal.kjetestjaja testlala ratesttsuvtesta !<-a- | | after: djd<aj.t

我试图在某些列之间的单行中替换所有不匹配的字符(搜索后)

示例
搜索可以是所有内容
在下面的示例中,搜索=
测试

非匹配字符的替换字符:空格

我想替换第10列和第30列之间“
test
”的所有非部分字符。
第10列和第30列用
|

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

before:djd一种方法是使用视觉模式(control+v)选择适当的列范围

选择后,可以使用()完成搜索和替换


可以在此处找到not test的正则表达式:

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

:s/\(test\)\zs\|\%>9v\%<31v./\=submatch(1)!=''?'':' '/g
:s/\(test\)\zs\\%>9v\%s/\(test\)\zs\\\\%V./\=子匹配(1)!=“”?“”/G

我还没有向自己证明这一点,但我认为单用正则表达式无法做到这一点。为了排除前10个字符,您必须以某种方式与它们匹配。。。一旦你匹配了,他们就有资格代替你。我认为你最好把字符串分成三段,进行替换,然后再连接起来……但我希望被证明是错误的。有时是10个字符,有时是更多或更少的字符。你如何将字符串分成3段并重新组合在一起?如果我严格地留在vim中,我只需在想要断开线的地方添加换行符,进行替换,然后再次加入线。如果这是我要定期做的事情,我会创建一个宏来进行替换和连接行(确保在连接后删除多余的空格)。我也喜欢@Bernhard的方法,但我从未尝试过。@Barton:非常感谢。我现在用专栏解决了我所有的问题!只是为了更好地理解,我必须改变什么才能做相反的事情。。仅替换第10行和第30行之间的
测试中的字母?我只是玩了一会儿,移动了
\zs
,并改变了其他东西,但没有任何效果。非常感谢!对于补充问题,如果事先知道列的范围,请使用命令
:%s/\%%>9vtest\%s/\%Vtes\%Vt/\=repeat(“”,strwidth(submatch(0)))/g
:s/\(test\)\zs\|\%>9v\%<31v./\=submatch(1)!=''?'':' '/g
:'<,'>s/\(test\)\zs\|\%V./\=submatch(1)!=''?'':' '/g