如何在Vim中查找一行中的第N个匹配项?

f8rj6qna  于 2022-11-11  发布在  其他
关注(0)|答案(4)|浏览(198)

我正在编辑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 |
ukxgm1gy

ukxgm1gy1#

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

额外奖励:

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

qqf yf|;;;p0q

对了,你问题的答案是:在一行中搜索第四个|是通过3f|完成的(如果光标位于位置0,并且位于|字符上,如示例所示)。

6mw9ycah

6mw9ycah2#

请考虑以下替换命令。

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

2ledvvac3#

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

意思是:在每一行(%)上,找出以下列字符串开头的三个匹配项(\{3\}):|然后是任何数量的非|([^|]*),并将其替换为自身(&),后跟|

nle07wnf

nle07wnf4#

您可以在vim中调用sed作为过滤器:

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

相关问题