Regex para encontrar linhas contendo apenas inteiros no vim

1

Eu tenho um arquivo contendo números inteiros (números de linha) e texto. Ao extrair um arquivo PDF, esses números de linha foram colocados em linhas separadas do texto e eu quero excluir todos esses números de linha. Eu não sou muito habilidoso com regexes, mas tenho 100% de certeza de que não deve ser super difícil. Eu uso o vim / nvim, mas se eu tivesse que usar o awk / sed, isso também funcionaria para mim.

Arquivo é algo como isto:

123
124
125

Text was found in
those three lines
should stay

Então, idealmente, eu quero pesquisar por: todas as linhas, que começam com um inteiro positivo (1,2,3 ... 123456) e contêm nada além desse inteiro. Eles devem ser excluídos.

Qualquer ajuda é muito apreciada.

Desafio de bônus : por algum motivo, algumas linhas começam com ^L1234 , então há um caractere especial adicional. Em algum momento eu gostaria de deletar esses também. Pode ser etapas separadas embora.

    
por Paul 08.02.2018 / 11:54

2 respostas

0
  • [0-9] é uma simples coleção de dígitos que funciona em praticamente qualquer lugar. No Vim, você também pode usar \d (dígito decimal).
  • Você deseja uma ou mais instâncias: acrescente o \+ multiplicador.
  • Essa deve ser a única coisa na linha, então o regexp precisa estar ancorado no início e no final (via ^ e $ , respectivamente).
  • Você quer tentar uma correspondência em todas as linhas; no Vim, isso é feito via :global/{pattern}/ .
  • As linhas de correspondência devem ser :delete d.

Juntos:

:global/^[0-9]\+$/delete

Você também pode usar sed ; é mais rápido e funciona de forma não interativa. Como isso aplica automaticamente qualquer regra a todas as linhas de entrada, você não precisa do :global e do :delete é apenas um d . Com -i , a substituição é feita no lugar (por isso, certifique-se de que está correta e tenha uma cópia de backup do arquivo original!)

sed -i -e '/^[0-9]\+$/d' file

Para o prefixo opcional, o multiplicador para isso é \? . Se esse ^L for um único caractere, você provavelmente precisará inseri-lo no Vim como <C-V><C-L> .

    
por 08.02.2018 / 12:12
0

Remover linhas iniciando e contendo apenas números inteiros no Vim

:%s/^[0-9]\+\n//gc

Explicação

  • :%s// - pesquisa global e substituir
  • ^ - começa no começo da linha
  • [0-9] - corresponde a dígitos
  • \+ - greedy corresponde a um ou mais
  • \n newline (Nota: verifique os finais de linha, eles variam entre sistemas e podem ser, por exemplo, \r\n )
  • gc - correspondência global + confirmar (remova c se houver muitos ou tiver certeza de que

Saída

123
124
125

Text was found in
those three lines
should stay

:%s/^[0-9]*\n//g

Text was found in
those three lines
should stay

Bônus

Por resposta de terdon em U & L , o ^L é o form feed character , que pode ser removido usando sed :

sed 's/\o14//g' file 

Vale a pena ler essa resposta para ver outras formas de o fazer.

    
por 08.02.2018 / 12:07