2012-03-15 37 views
4

我正在編輯一個wiki文件,我想在兩列之間添加一個新列。在vim中搜索第n個匹配行

| *No* | *Issue* | *File* | *Status* | 
| 1 | blah | foo | open | 
| 2 | blah1 | foo1 | close | 

現在在第3和第4列之間我想插入另一列,如果我可以搜索第四個匹配的「|」字符在一個給定的行中,我可以用「| |」替換它。如何使用vim做到這一點?

最終的結果會是這樣的

| *No* | *Issue* | *File* | | *Status* | 
| 1 | blah | foo | | open | 
| 2 | blah1 | foo1 | | close | 
+0

如何使用宏('q')來做到這一點? – Kent 2012-03-15 11:32:55

回答

0

可以在vim調用sed作爲過濾器:

:%!sed 's/|/| |/3' 
1

考慮以下替換命令。

:%s/\%(.\{-}|\)\{4}\zs/ |/ 
3

如何通過在命令模式進入qq3f|a|<ESC>q錄製宏到寄存器q(ESC裝置按下退出鍵)。現在,您可以通過:%[email protected]將此宏應用於每行。

附加獎金:

有了這個圖案可以添加更復雜的動作,例如複製的第一列作爲第3列(如果光標位於第一列):

qqf yf|;;;p0q 

哦和你的問題的答案:在|上搜索第4次出現是由3f|完成的(如果光標位於位置0和|字符,如你的例子)。

+0

您可以使用'%'而不是'0,$'。更好。 – 2012-03-15 13:46:11

+0

啊,右鍵 - 修正。 – hochl 2012-03-15 13:47:27

0
:%s/\(|[^|]*\)\{3\}/&|/

這意味着:每行(%),發現與開頭的字符串的三宗(\{3\})|其次是任何數量的非| ([^|]*),並用自己替換(&),然後再替換|