Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 如何在Vim中搜索一行中的第n个匹配项?_Search_Vim_Editor_Match - Fatal编程技术网

Search 如何在Vim中搜索一行中的第n个匹配项?

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*

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

您可以在
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\}/&| /