¿Cómo puedo eliminar líneas duplicadas en Visual Studio Code?

118

Digamos que tiene el siguiente texto:

abc
123
abc
456
789
abc
abc

Quiero eliminar todas las líneas "abc" y conservar una. No me importa ordenar. El resultado debería ser así:

abc
123
456
789
Younes
fuente

Respuestas:

223

Si el orden de las líneas no es importante

Ordene las líneas alfabéticamente, si aún no lo están, y siga estos pasos:
(según esta pregunta relacionada: ¿Cómo puedo encontrar y eliminar líneas duplicadas de un archivo usando Expresiones regulares? )

  1. Control+F

  2. Alternar "Modo de reemplazo"

  3. Alternar "Usar expresión regular" (el icono con el .*símbolo)

  4. En el campo de búsqueda , escriba^(.*)(\n\1)+$

  5. En el campo " reemplazar por ", escriba$1

  6. Haga clic en el botón Reemplazar todo("Reemplazar todo").

Si el orden de las líneas es importante para que no pueda ordenar

En este caso, recurra a una solución fuera de VS Code (consulte aquí ) o, si su documento no es muy grande y no le importa enviar spam al botón Reemplazar todo, siga los pasos anteriores, pero en los pasos 4 y 5, ingrese estos:
(basado en Eliminar líneas duplicadas específicas sin ordenar )

Precaución: Bloques para archivos con demasiadas líneas (1000+); puede hacer que VS Code falle; puede introducir líneas en blanco en algunos casos.

  • buscar :((^[^\S$]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\n)?

  • reemplazar con :$1

y luego haga clic en el botón "Reemplazar todo" tantas veces como ocurrencias duplicadas .

Sabrá que es suficiente cuando el recuento de líneas deje de disminuir al hacer clic en el botón. Navega hasta la última línea del documento para vigilarlo.

Marc.2377
fuente
4
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?hizo que mi vscode se bloqueara ... Hice una búsqueda en un archivo de 229 líneas. :(
Hickory420
@ Hickory420 Probé en mi máquina con 1000 líneas (20 caracteres de largo, aleatorias) y no obtuve ningún bloqueo, pero sí un hilo se bloquea con una carga de CPU del 100% durante unos segundos en cada pasada. Sí, esto no es práctico para archivos grandes.
Marc.2377
Gracias por esto. ¿Puede explicar la expresión regular ^(.*)(\n\1)+$. Después de eliminar las filas duplicadas, quiero ver todas las filas con la primera columna duplicada en el csv y quiero modificar la expresión regular.
Urvah Shabbir
1
Wow, siento que soy bastante bueno en expresiones regulares y esto todavía me dejó alucinado, ¡gran respuesta!
electrovir
@UrvahShabbir, se da una explicación para esa parte de la expresión regular en las preguntas y respuestas vinculadas . El mío solo es diferente en que el \r?bit de la otra respuesta no es realmente necesario.
Marc.2377
66

Aquí hay una extensión muy interesante: Transformer

caracteristicas:

  • Líneas únicas
  • Líneas únicas como documento nuevo
  • Líneas de filtro
  • Filtrar líneas como documento nuevo
  • Clasificar líneas
  • Ordenar líneas por longitud
  • Alinear al cursor
  • Alinear CSV
  • CSV compacto
  • Copiar a documento nuevo
  • Seleccionar líneas
  • Líneas como JSON
  • Recortar líneas
  • Contar líneas duplicadas como documento nuevo
  • Macros

Para eliminar líneas duplicadas:

  • Elimina líneas duplicadas del documento

  • Opera en la selección o el bloque actual si no hay selección

No he jugado mucho con él además del comando "Líneas únicas", pero parece bastante bien hecho (¡incluido el intento de una grabadora de macros!).

marca
fuente
26

Para agregar a la respuesta de @ Marc.2377.

Si el orden es importante y no le importa mantener la última de las líneas duplicadas, simplemente busque la siguiente expresión regular si solo desea eliminar las líneas duplicadas no vacías

^(.+\n)(?=(?:.*\n)*?\1)

Si también desea eliminar las líneas vacías duplicadas, utilice en *lugar de+

^(.*\n)(?=(?:.*\n)*?\1)

y reemplazar con nada.

Captura de pantalla del cuadro de búsqueda y reemplazo lleno

Esto tomará una línea e intentará encontrar más adelante (tal vez 0) líneas seguidas de exactamente la misma línea tomada. Eliminará la línea tomada.

Esta es solo una expresión regular de una sola vez. No es necesario enviar spam al botón Reemplazar.

Skeeve
fuente
Muy sucinto
angus l
4
Agradable. En su ^(.+\n)(?=(?:.*\n)*?\1)lugar, lo recomiendo porque su expresión regular eliminó una línea vacía donde no se esperaba. Voto a favor de todos modos.
Marc.2377
Buena captura… OTOH: las líneas vacías duplicadas también son duplicadas;)
Skeeve
1
@Skeeve Vamos, esto solo un pequeño agradecimiento por tu útil respuesta y todo por una mejor comunidad :)
Zaman
1
xxx(?=…)es una coincidencia anticipada. Por lo tanto, se asegura de que lo que sigue a "xxx" coincida con "…", pero no avanza en la búsqueda. (?:…)es solo un paréntesis que no cuenta en el recuento de paréntesis. .*\nes un patrón para una línea (posiblemente vacía). *significa que puede haber varias líneas, incluso ninguna. El ?después del asterisco ( *) significa que queremos la menor cantidad de líneas posible. Como \1sigue a esta expresión, el efecto es que miramos hacia adelante para todas las líneas que no coinciden \1hasta que encontramos una línea que coincida \1. Espero que esto lo aclare.
Skeeve
22

Acabo de tener el mismo problema y encontré el paquete de código de Visual Studio "Ordenar líneas". Consulte el mercado de Visual Studio Code para obtener más detalles (por ejemplo, ordenar líneas ).

Este paquete tiene la opción "Clasificar líneas (únicas)", que lo hizo por mí. Cuide los espacios en blanco al principio / final de las líneas. Influyen en si las líneas se consideran únicas o no.

SimonAx
fuente
marketplace.visualstudio.com/… también debería funcionar.
kcpr
1
Parece que la extensión ya no tiene la capacidad de eliminar entradas duplicadas. Combinarlo con la respuesta de @ Marc-2377 parece ser el truco para mí.
Dan Atkinson
12

Instale la extensión DupChecker , presioneF1 y escriba "Comprobar duplicados".

Verificará si hay duplicados y le preguntará si desea eliminarlos.

perfecto25
fuente
11

Intente buscar y reemplazar con una expresión regular .

  • Encontrar: ^(.+)((?:\r?\n.*)*)(?:\r?\n\1)$

  • Reemplazar: $1$2

Es posible introducir alguna variación en el primer grupo.

Lavock
fuente
-3

No en Visual Studio Code, pero si funciona, funciona.

  1. Abra una nueva hoja de cálculo de Excel
  2. Pega los datos en una columna
  3. Vaya a la pestaña Datos
  4. Seleccione la columna de datos (si aún no lo ha hecho)
  5. Haga clic en Eliminar duplicados (algo en el medio de la barra)
  6. Haga clic OKpara eliminar los duplicados.

No es la mejor respuesta, como especificó Visual Studio Code, pero como dije: si funciona, funciona :)

NostraDavid
fuente
Puede hacerlo más relevante proporcionando un script al que se pueda llamar directamente desde Visual Studio Code. En otras palabras, automatiza este proceso. No sé si es posible, pero un script que invocaría a Excel a través de sus interfaces COM expuestas. Esto haría que esta respuesta sea mucho más valiosa, ya que sería un ejemplo de cómo aprovechar otras aplicaciones para hacer cosas interesantes.
Peter Mortensen