删除多个文件中除多行以外的所有内容

删除多个文件中除多行以外的所有内容

我有一大堆具有特定模式的文件

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。

但是使用argsargdo按照建议这里对于多个文件,在上面的第二个操作中会抛出错误“不是编辑器命令”。如果我绕过第二个,直接进入第三个和第四个,也会发生同样的情况。我正在表演argsargdo完成每一步。

有什么建议留在 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

相关内容