Search 如何在Vim中搜索一行中的第n个匹配项?
我正在编辑一个wiki文件,希望在两个现有列之间添加一个新列Search 如何在Vim中搜索一行中的第n个匹配项?,search,vim,editor,match,Search,Vim,Editor,Match,我正在编辑一个wiki文件,希望在两个现有列之间添加一个新列 | *No* | *Issue* | *File* | *Status* | | 1 | blah | foo | open | | 2 | blah1 | foo1 | close | 比如说,我想在上面的第3列和第4列之间插入一个新列。如果我可以搜索给定行中|字符的第四个匹配项,我可以将其替换为|。但是如何在Vim中做到这一点呢 最终结果是这样的: | *No* | *Issue* | *File* | | *Status*
| *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 |
您可以在
vim
中调用sed
作为过滤器:
:%!sed 's/|/| |/3'
考虑以下替换命令
:%s/\%(.\{-}|\)\{4}\zs/ |/
在命令模式下输入
qq3f | a | q
将宏记录到寄存器q
(ESC表示按下退出键)。现在,您可以通过:%将此宏应用于每一行norm@q
额外奖金:
使用此模式,您可以添加更复杂的操作,例如,将第一列复制为第3列(如果光标位于第一列):
哦,您的问题的答案是:在一行中搜索第四次出现的
是由3f
完成的(如果光标位于位置0,并且位于
字符上,如您的示例所示)
这意味着:在每一行(
%
)上,找到一个字符串的三个匹配项({3\}
),该字符串以|开头,后跟任意数量的非|([^ |]*
),并将其替换为自身(&
),然后是
。您可以使用%
,而不是0,$
。更好。用宏(q
)来做怎么样?
qqf yf|;;;p0q
:%s/\(|[^|]*\)\{3\}/&| /