在vim的一行中搜索第n个匹配

时间:2012-03-15 11:25:03

标签: search vim editor match

我正在编辑一个wiki文件,我想在两列之间添加一个新列。

| *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 |

4 个答案:

答案 0 :(得分:3)

如何通过在命令模式下输入q来将宏录制到寄存器qq3f|a|<ESC>q中(ESC表示按Esc键)。现在,您可以通过:%norm@q将此宏应用于每一行。

额外奖励:

使用此模式,您可以添加更复杂的操作,例如将第一列复制为第3列(如果光标位于第一列):

qqf yf|;;;p0q

哦,问题的答案:在|上搜索第{4}次3f|(如果光标位于第0位,|字符为在你的例子中。)

答案 1 :(得分:1)

考虑以下替换命令。

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

答案 2 :(得分:1)

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

这意味着:在每一行(%)上,找到三个以|开头的字符串出现(\{3\})其次是任意数量的非| ([^|]*),并将其替换为自身(&),后跟|

答案 3 :(得分:0)

您可以在sed中呼叫vim作为过滤器:

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