0

我有一个由find创建的文件,像这样......

./a/b/c/d/f.x
./a/b/c/e/shao.tnh
./a/b/c/e/ehn.he
./a/b/f/g/h
./a/b/u

我需要浏览它,但它非常大。

有什么办法可以让我的光标在第 1 行的 c 上,然后从光标到行首进行某种宏扫描,将扫描的部分输出到某个日志文件,然后向下一行删除该行如果它匹配扫描的前缀模式,即^./a/b/c,然后重复该过程直到它到达不匹配的行?

换句话说,我会按一个键,在这种情况下,删除文件的前三行,并可能将“./a/b/c/”行附加到单独的日志文件中。

理想情况下,我还有一个宏可以跳到没有前缀的下一行而不修改任何内容。

谢谢!

4

1 回答 1

0
:nnoremap <leader>dd mzv0"zy?\V\^<C-R>z<CR>V'zj"_D`zj:nohlsearch<CR>

如果没有出现奇怪的字符(特别是反斜杠),这应该对您的行进行前缀重复数据删除,并将您的前缀保留在z寄存器中;您可以扩展映射以切换到另一个缓冲区并将其粘贴,或者将其 shell-cat 到文件,或任何您想要的。它会覆盖z标记和z寄存器。

:nnoremap <leader>ds v0"zy?\V\^<C-R>z<CR>j:nohlsearch<CR>

这应该让您到达第一行,而不是以前缀开头。覆盖z寄存器,不会弄乱标记。

编辑解释:

mz     - set the mark `z` (on the character `c`)
v      - start character-wise visual mode
0      - jump to start of the line
"zy    - yank the visual contents (`./a/b/c`) into the `z` register
?      - start backwards search
\V     - enable very no magic mode (`:help /magic` - basically, only backslash is
         special)
\^     - start of line in very no magic mode
<C-R>z - paste the contents of the `z` register (`./a/b/c`)
<CR>   - perform the search (we end up on the *last* mention of `./a/b/c` at the
         start of the line)
V      - start linewise visual mode
'z     - jump to the line where the `z` mark is (the line where we started)
j      - down one line
"_D    - cut the visual selection into the black hole register so we don't
         pollute more than necessary (we delete every line starting with
         `./a/b/c` except the first)
`z     - jump to the character where the `z` mark is (`c` in the first line)
:nohighlight<CR> - remove the search highlight

类似地用于\ds映射。

为防止反斜杠扰乱搜索,您需要在执行搜索之前将所有反斜杠替换为双反斜杠。

EDIT2:是的,即使使用反斜杠也可以:

:nnoremap <leader>dd mzv0"zy?\V\^<C-R>=escape(@z, '\\')<CR><CR>V'zj"_D`z:nohlsearch<CR>

添加位的说明:

<C-R>= - starts the paste of result of expression evaluation
escape(@z, '\\') - escapes the backslashes in `z` register
<CR>   - ends the expression and pastes it in the search box
于 2013-09-09T09:36:25.670 回答