我有一大堆具有特定模式的文件
ABCD:
Something 1
Anything 2
EFGH:
Something 3
Anything 4
ABCD:
Something 5
Anything 6
HIJK:
Something 7
Anything 8
我想保留 ABCD 之后的第二行并删除所有这些文件中的其他所有内容。在单个文件上,可以使用 vim 通过以下命令来实现
/ABCD\_[^a-zA-Z] (*searches the pattern*)
qaq (*flush register*)
:g//norm! "A3Y (*yank 3 lines including pattern into register A*)
ggVG"ap (*delete everything else*)
然后我可以执行一些简单的正则表达式搜索来删除 ABCD 和 Somethings,留下正确的 Anythings。
但是使用args
并argdo
按照建议这里对于多个文件,在上面的第二个操作中会抛出错误“不是编辑器命令”。如果我绕过第二个,直接进入第三个和第四个,也会发生同样的情况。我正在表演args
并argdo
完成每一步。
有什么建议留在 vim 内或超越 vim 吗?
答案1
尝试将整个事情变成一个巨大的normal!
命令:
:argdo norm! /ABCD\_[^a-zA-Z]<C-v><CR>qaq:g//norm! "A3Y<C-v><CR>ggVG"ap
使用<C-v><cr>
允许您输入文字回车符。这解决了您的问题,但是您的方法仍然有很多不理想的地方。
例如:
无需搜索某些内容,然后使用
:g//
。相反,只需使用:g/ABCD\_[^a-zA-Z]
即可。您可以使用
\_A
代替\_[^a-zA-Z]
不需要让全局命令执行普通命令。相反,执行 ex 命令,您将不需要清除寄存器“a”。就这样吧
:g/ABCD\_A/3ay
。
将所有这些放在一起,我建议
:argdo norm! :g/ABCD\_A/3ya<C-v><CR>ggVG"ap
答案2
因为您也在使用以下方式寻找答案awk
:
awk '/ABCD/ {getline; getline; print}' input