2013-06-05 107 views
1

我想搜索一個字符串並用第一個字符串中包含的第二個字符串替換。例如,我有以下行搜索並替換VIM上的字段

key1: foo 
    key2: bar 

我正則表達式是maches此行我所希望的方式是:

^\s\+\w:.\+ 

我想類似的東西來代替整行:

foo -> key1 
bar -> key2 

我該怎麼做?

回答

6

Vim使用\1 \2等作爲反向引用,所以你應該能夠使用:

:%s/^\s\+\(\w\+\): \(\w\+\)/\2 -> \1/g 

擊穿:

  • ^\s\+:在字符串的開頭一個或多個空格。使用*如果有可能是零
  • \(\w\+\):捕獲組字字符轉換成\1
  • :字面結腸和空間
  • \(\w\+\):用於所述第二對
  • /\2 -> \1/置換反向引用另一捕獲組。消除了空白,以及交換兩組

(這裏的\v非常神奇的版本,這看起來要好很多,避免噸元字符轉義):

:%s/\v\s+(\w+): (\w+)/\2 -> \1/g 
+0

獲得我認爲'FOO - > key1'是沒有結果的OP想,他可能想'foo換成與key1'但不是100%肯定。 – Kent

1

我拿出此,:s命令,

%s/\v\s*([^:]*):\zs.*/\1/ 
1

替代取代

:%norm <<dWA -> ^]pbD 

注意^]通過按<c-v><esc>

+0

我認爲用':g'會更好。 – Kent

+0

@Kent。我能理解這一點。 ':g/\ v \ s + \ w +:\ s * \ w +/norm ^] pbD'是一個更大的命令。我可能會運行替代。然而,有多種解決方案是很好的。特別是當我們對有關文本知之甚少時。 –