Respuesta1
He proporcionado varias soluciones posibles para su consideración. Por favor, perdóname si repaso algo que ya sabes. =)
TL;DR
A partir de Notepad++ v7.7.1, Notepad++ tiene una función llamadaEliminar líneas duplicadas consecutivasque hace lo mismo que las otras dos soluciones que se dan a continuación (es decir, elimina líneas duplicadas consecutivas).
Se puede acceder conEditar → Operaciones de línea → Eliminar líneas duplicadas consecutivas.
VerLa respuesta de BartlebyA continuación se muestra un ejemplo de una expresión regular que deduplicará líneas sin ordenarlas.
Respuesta original
Según el comentario de @máté-juhász, la respuesta aceptada a estoPregunta de desbordamiento de pilafuncionará con sus datos de ejemplo.
En esencia:
AbiertoBuscar → Reemplazar...( Ctrl+ H) en el Bloc de notas++.
En el campo "Buscar qué:", ingrese lo siguienteexpresión regular:
^(.*?)$\s+?^(?=.*^\1$)
Deje el campo "Reemplazar con:" en blanco y asegúrese de marcar "Expresión regular" en las opciones de "Modo de búsqueda".
Una vez que esté listo para eliminar sus líneas, haga clic en "Reemplazar todo".
Tenga en cuenta que la respuesta original parece indicar que la . matches newline
opción debe estar marcada, pero algunas personas en los comentarios aparentemente tuvieron más suerte al dejarla sin marcar. Para tus datos, lo dejé sin marcar y parecía funcionar bien.
ex. Usando expresiones regulares
Usando uniq
Como alternativa, suponiendo que no haya otra opción que satisfaga sus necesidades, si tiene un puerto Windows del sistema basado en Unixúnicoutilidad, posiblemente podría integrar esto en su flujo de trabajo con Notepad++.
En resumen, uniq
realiza la misma función que la expresión regular anterior pero de una manera potencialmente más confiable. La desventaja es que incorporarlo con Notepad++ es un truco. Teniendo esto en cuenta, si desea intentarlo, los pasos básicos se describen a continuación.
Conseguir único
Para comenzar, necesita una copia de uniq
Windows. Puede que haya varias opciones disponibles pero, para simplificar, le sugiero laPaquete GnuWin32 CoreUtilsque incluye uniq
. Actualmente puedes descargar uninstalador ligerosi opta por no descargar ni combinar las versiones comprimidas de los componentes del paquete CoreUtils usted mismo.
Como consejo, para cada paso de la solución que involucre uniq
, omitiría el uso de rutas con espacios. Unix a menudo trata los espacios en los nombres de directorios de manera diferente que Windows, por lo que las utilidades trasladadas desde ese entorno pueden tener problemas con ellos.
Como referencia, no estoy seguro de qué límites de tamaño de archivo (si los hay) podrían aplicarse a la compilación GnuWin32 de uniq
, pero a menudo lo uso para archivos de texto con al menos varios megabytes de datos (a menudo varios cientos de miles de líneas) con facilidad.
Usando uniq con Notepad++
Una vez uniq
instalado, coloque algo similar a las siguientes líneas en un archivo por lotes:
C:\path\to\uniq.exe %* > C:\temp\uniq_tmp.txt
notepad++ C:\temp\uniq_tmp.txt
exit()
Guarde este archivo por lotes en un directorio permanente con el que se sienta cómodo. Para fines de referencia, llamaré a estouniq_npp.bat. Tenga en cuenta que "temp" puede ser cualquier carpeta, pero "tmp" y "temp" a menudo ya existen en Windows. Del mismo modo, "uniq_tmp.txt" puede tener cualquier nombre que desee, siempre que se utilice de forma coherente.
Después de guardaruniq_npp.bat, entonces estamos listos para integrar su funcionalidad en Notepad++. Para hacer esto, abra el Bloc de notas++.Correr...menú ( F5) e ingrese algo similar a lo siguiente en el campo que aparece:
cmd /k C:\path\to\uniq_npp.bat "$(FULL_CURRENT_PATH)"
Puedes probar tu comando Notepad++ antes de guardarlo si haces clic en el botón "Ejecutar" situado más a la izquierda.
ex. Ejecutar... Diálogo
De lo contrario, haga clic en "Guardar..." y asigne un nombre apropiado a su comando. Puedes darle un atajo de teclado si lo deseas, pero no es necesario. Haga clic en "Aceptar" para conservar la configuración del comando y colocarla en elCorrer...menú desplegable para su uso posterior.
ex. Ejecutar menú desplegable
Suponiendo que le interese, tengo una descripción muy breve de los detalles de cómo uniq
funciona la solución en la sección "Notas" al final de esta respuesta.
Advertencias
Una cosa importante para recordar acerca de estas soluciones uniq
es queabsolutamente requiereuna ruta a un archivo guardado en el disco (el documento no se puede abrir solo en Notepad++).
Esto no es un problema con un archivo existente que haya abierto, pero si crea un archivo nuevo o modifica un original existente, debeAhorrarprimero antes de ejecutar suuniq_npp.batarchivo. De lo contrario, la operación fallará y los datos nuevos no se ordenarán.
Como pequeña ventaja, probablemente valga la pena mencionar que esta limitación para guardar no se aplica a la opción de expresión regular anterior.
Notas
Clasificación
Las soluciones ofrecidas (es decir, la expresión regular inicial y uniq
) requieren que aparezcan líneas duplicadas directamente una encima de la otra para ser eliminadas, por ejemplo:
duplicate line X
duplicate line X
Esto significa que es importante ordenar sus datos antes de aplicar una de estas operaciones. Supongo que ya está haciendo esto dados los datos de su ejemplo, pero vale la pena mencionarlo de todos modos.
Macros del Bloc de notas++
Como pequeña sugerencia, dado que Notepad++ no tiene ningún atajo de teclado real para sus operaciones de clasificación de líneas integradas, es posible que desees grabar una macro para ayudar con la clasificación. En particular, puede grabar unEditar → Seleccionar todo( Ctrl+ A) operación y luego elija una de lasEditar → Operaciones de línea → Ordenar líneas lexicográficamenteopciones.
Para la uniq
solución, también puede valer la pena considerar grabar una operación "Guardar" como paso final de una macro de clasificación. Tenga en cuenta también que los pasos para la opción de expresión regular (abrir el cuadro de diálogo Reemplazar, ingresar la expresión regular, etc.) también se pueden grabar en una práctica macro.
Cómo funciona la solución uniq
En breve:
La línea "Ejecutar..." genera una ventana de comando (
cmd /k
), llamauniq_npp.baty le proporciona la ruta donde está almacenado el archivo actual que ha seleccionado.Enuniq_npp.bat, esta ruta se captura mediante el
%*
comodín pasado auniq
. Los datos deduplicadosuniq
se redirigen (>
) a "uniq_tmp.txt".Por último, el archivo por lotes abre este texto limpio en una nueva pestaña de Notepad++ y la ventana de comandos se cierra mediante
exit()
.
uniq_npp.bat Mejoras (?)
Con respecto a la clasificación, otra opción es omitir el uso de Notepad++ para ordenar todas las cosas juntas. Es posible que pierda algo de flexibilidad en el proceso con respecto a las opciones de clasificación, pero puede ordenar elementos como un paso adicional en su archivo por lotes a través delordenar ventanasdominio. Para agregar este paso, puede modificar la primera línea deuniq_npp.batcomo sigue:
sort %* | C:\path\to\uniq.exe > C:\temp\uniq_tmp.txt
Esto simplemente canaliza los datos ordenados de sort
a uniq
. Como puede ver, sort
ahora captura inicialmente la ruta de datos, en lugar de uniq
.
Otra idea es (posiblemente) usar el %*
comodín como parte de una operación de cadena para obtener el nombre del archivo original y reemplazar, por ejemplo, "uniq_tmp.txt" con algo como "original-filename_uniq.txt" para hacerlo más... único.
Peligros potenciales
De forma predeterminada, Windows
sort
ordenará los números como, por ejemplo1 11 2 21
si no están precedidos por 0 (por ejemplo 01, 02, 011, 021
).
- Si bien el paquete GnuWin32 CoreUtils viene con un puerto delclasificación Unixutilidad (que tiene opciones más sólidas que Windows
sort
), esta implementación en particular (a diferencia de la mayoría de las utilidades GnuWin32) me parece un poco pobre en Windows. Sin embargo, si utiliza un puerto de Windows diferente de la versión Unix desort
, es posible que este problema no se aplique y, en general, podría resultar una mejor opción.
Respuesta2
Descubrí que esto funciona bien para elementos que no están en orden:
Buscar:
(?s)^(.*?)$\s+?^(?=.*^\1$)
Haga clic en 'Reemplazar todo' dentro sin nada en el campo 'Reemplazar con:'.
Editar:
Aquí está el paso a paso:
(?s) El punto también coincide con la nueva línea.
^ Inicio de línea
(.*?)$ Establezca el primer grupo de captura haciendo coincidir cero o más de cualquier carácter, sin avidez, hasta el primer final de línea que se encuentre.
\s+? Haga coincidir uno o más caracteres de espacio en blanco, sin avidez
^ Inicio de línea (nuevamente)
(?= Búsqueda anticipada positiva con un grupo que no captura (este patrón debe coincidir, pero no se almacena).
.*^\1$) Coincide con cero o más caracteres, con avidez, continuando hasta una nueva línea donde toda la línea coincide con el primer grupo de captura.
Entonces, la expresión regular crea un grupo de captura y luego busca en todas las líneas del documento hasta que encuentra una que coincida exactamente con esa línea y reemplaza la línea original por nada.
Anexo: No estaba pensando en eso en ese momento y le pido disculpas al creador de Regex, pero creoScottes correcto porque estaba usando una versión ligeramente modificada de una expresión regular que alguien más había creado. Si tuviera que adivinar su origen, creo que probablemente sea más probable que sea la respuesta realmente acreditada en el enlace que dio, que se puede encontraraquí.
Para terminar, acepte mis disculpas por:
- No dar crédito a quien corresponde. No estaba pensando en eso en ese momento, pero debería haberlo hecho.
- No explicar completamente la respuesta que proporcioné, lo que aumentaría la comprensión de alguien sobre lo que está sucediendo, por lo que podría utilizar esa información para otros problemas.
- No responder al comentario de Scott más rápidamente. No soy muy experto en el uso de este sitio (de ahí mi baja puntuación) y no pensé en revisar mis notificaciones hasta hoy.
¡Mea culpa!
Respuesta3
Gracias, pero regex y uniq solo detectaron líneas duplicadas una al lado de la otra. Al usar este script awk como awkuniq-npp.bat, es compatible con Notepad++. Archivo bat de 4 líneas:
C:\rutaa\awk.exe '(a[$0]++==0)' %* > %*.1 del %* mover %*.1 %* salida()Comando para ejecutar:
cmd /k C:\ruta\awkuniq-npp.bat "$(FULL_CURRENT_PATH)"
Utiliza la recarga automática después de eliminar/mover para reemplazar el mismo nombre de archivo
Respuesta4
Utilizo la siguiente expresión regular de búsqueda/reemplazo (después de ordenar las líneas), la encuentro más intuitiva de entender:
Find: (.*)\r?\n(\1\r?\n)+
Replace with: \1\r\n
Explicación:
- busque "cualquier cosa" (una línea de texto) seguida de una nueva línea (\n o \r\n): .\r?\n
- mantiene el contenido de la línea en una variable: (.)\r?\n
- busca repeticiones de la misma línea una o más veces: (.*)\r?\n(\1\r?\n)+
Reemplazo: - Reemplace todo lo anterior solo con la línea misma y la nueva línea: \1\r\n
Espero que te ayude,
sb3k.