Exclua todas as linhas, exceto múltiplas, em vários arquivos

1

Eu tenho um monte de arquivos com determinados padrões

ABCD: 
Something 1 
Anything 2

EFGH:
Something 3
Anything 4

ABCD:
Something 5
Anything 6

HIJK:
Something 7
Anything 8

Eu quero manter a segunda linha após o ABCD e excluir tudo em todos esses arquivos. Em um único arquivo, isso pode ser obtido usando o vim pelos seguintes comandos

/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*)

Em seguida, posso executar algumas pesquisas de regex fáceis para excluir os ABCDs e Somethings para serem deixados com as Anythings corretas.

No entanto, usar args e argdo como sugerido aqui para vários arquivos gera erros "Não é um comando do editor" na segunda operação acima. A mesma coisa acontece se eu ignorar o segundo e ir diretamente para o terceiro e quarto. Estou executando args e argdo após cada etapa.

Alguma recomendação que permaneça dentro ou fora do vim?

    
por MaviPranav 19.06.2017 / 20:01

2 respostas

2

Tente transformar a coisa toda em um comando gigante normal! :

:argdo norm! /ABCD\_[^a-zA-Z]<C-v><CR>qaq:g//norm! "A3Y<C-v><CR>ggVG"ap

Usar <C-v><cr> permite inserir um retorno de carro literal. Isso resolve seu problema, mas ainda há muitas coisas sobre sua abordagem que não são ideais.

Por exemplo:

  • Não é necessário procurar por algo e, em seguida, usar :g// . Em vez disso, use apenas :g/ABCD\_[^a-zA-Z] .

  • Você pode usar \_A em vez de \_[^a-zA-Z]

  • Não há necessidade de fazer o comando global executar um comando normal. Em vez disso, faça um comando ex e você não precisará limpar o registro 'a'. Então, faça :g/ABCD\_A/3ay .

Colocando tudo isso junto, recomendo

:argdo norm! :g/ABCD\_A/3ya<C-v><CR>ggVG"ap
    
por 19.06.2017 / 20:37
1

Como você também está procurando uma resposta usando awk :

awk '/ABCD/ {getline; getline; print}' input
    
por 20.06.2017 / 11:07