Remova linhas começando e contendo apenas números inteiros no Vim

Remova linhas começando e contendo apenas números inteiros no Vim

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 quero excluir todos esses números de linha. Não sou muito habilidoso com expressões regulares, mas tenho 100% de certeza de que não deve ser muito difícil. Eu uso vim/nvim, mas se eu tivesse que usar awk/sed, isso funcionaria para mim também.

O arquivo se parece com isto:

123
124
125

Text was found in
those three lines
should stay

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

Qualquer ajuda é muito apreciada.

Desafio bônus: por algum motivo, algumas linhas começam com ^L1234, então há um caractere especial adicional. Em algum momento eu gostaria de excluí-los também. Porém, podem ser etapas separadas.

Responder1

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

Tomados em conjunto:

: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 o :deleteestá apenas dlá. Com -i, a substituição é feita no local (portanto, certifique-se de estar correto e de ter uma cópia de backup do arquivo original!)

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

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

Responder2

Remova linhas começando e contendo apenas números inteiros no Vim

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

Explicação

  • :%s//- pesquisa global e substituição
  • ^- comece no início da linha
  • [0-9]- combinar dígitos
  • \+- combinação gananciosa de um ou mais
  • \ncorresponder à nova linha (Nota: verifique os finais de linha, eles variam entre os sistemas e podem ser, por exemplo, \r\nem vez disso)
  • gc- correspondência global + confirmação (remova cse houver muitos ou tiver certeza

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

Porresposta de terdon em U&L, o ^Lé o form feed characterque pode ser removido usando sed:

sed 's/\o14//g' file 

Vale a pena ler essa resposta para ver outras maneiras de fazer isso.

informação relacionada