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
:delete
d.
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 :delete
está apenas d
lá. 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 ^L
um ú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\n
corresponder à nova linha (Nota: verifique os finais de linha, eles variam entre os sistemas e podem ser, por exemplo,\r\n
em vez disso)gc
- correspondência global + confirmação (removac
se 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 character
que pode ser removido usando sed
:
sed 's/\o14//g' file
Vale a pena ler essa resposta para ver outras maneiras de fazer isso.