Tengo un archivo que contiene números enteros (números de línea) y texto. Al extraer un archivo PDF, esos números de línea se colocaron en líneas separadas del texto y quiero eliminar todos esos números de línea. No soy muy hábil con las expresiones regulares, pero estoy 100% seguro de que no debería ser muy difícil. Yo uso vim/nvim, pero si tuviera que usar awk/sed eso también funcionaría para mí.
El archivo se parece a esto:
123
124
125
Text was found in
those three lines
should stay
Lo ideal es buscar: todas las líneas que comiencen con un número entero positivo (1,2,3...123456) y no contengan nada más que ese número entero. Deberían eliminarse.
Cualquier ayuda es muy apreciada.
Desafío de bonificación: por alguna razón, algunas líneas comienzan con ^L1234
, por lo que hay un carácter especial adicional. En algún momento también querría eliminarlos. Sin embargo, pueden ser pasos separados.
Respuesta1
[0-9]
es un simplerecopilaciónde dígitos que funciona en casi cualquier lugar. En Vim, también puedes usar\d
(dígito decimal).- Quieres una o más instancias: agrega el
\+
multiplicador. - Eso debería ser lo único en la línea, por lo que la expresión regular debe serancladohasta el principio y el final (vía
^
y$
, respectivamente). - Quiere intentar una coincidencia en todas las líneas; en Vim, eso se hace a través de
:global/{pattern}/
. - Las líneas coincidentes deben ser
:delete
d.
Tomados en conjunto:
:global/^[0-9]\+$/delete
También puedes usar sed
; es más rápido y funciona de forma no interactiva. Como esto aplica automáticamente cualquier regla a todas las líneas de entrada, no necesita el :global
, y el :delete
está d
ahí. Con -i
, el reemplazo se realiza en el lugar (¡así que asegúrese de hacerlo bien y de tener una copia de seguridad del archivo original!)
sed -i -e '/^[0-9]\+$/d' file
Para el prefijo opcional, el multiplicador es \?
. Si se trata ^L
de un solo carácter, probablemente necesites ingresarlo en Vim como <C-V><C-L>
.
Respuesta2
Eliminar líneas que comienzan y contienen solo números enteros en Vim
:%s/^[0-9]\+\n//gc
Explicación
:%s//
- búsqueda y reemplazo global^
- empezar al principio de la línea[0-9]
- coincidir con dígitos\+
- partido codicioso uno o más\n
coincidir con nueva línea (Nota: verifique los finales de línea, estos varían entre sistemas y pueden ser, por ejemplo,\r\n
en su lugar)gc
- coincidencia global + confirmar (eliminarc
si hay muchas o estás seguro)
Producción
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
Prima
Porla respuesta de terdon en U&L, ^L
es el form feed character
, que se puede eliminar usando sed
:
sed 's/\o14//g' file
Vale la pena leer esa respuesta para ver otras formas de hacerlo.