2012-04-10 47 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

相關問題