Como posso remover linhas duplicadas no Visual Studio Code?

118

Digamos que você tenha o seguinte texto:

abc
123
abc
456
789
abc
abc

Desejo remover todas as linhas "abc" e manter apenas uma. Eu não me importo em classificar. O resultado deve ser assim:

abc
123
456
789
Younes
fonte

Respostas:

223

Se a ordem das linhas não for importante

Classifique as linhas em ordem alfabética, se ainda não estiverem, e execute estas etapas:
(com base nesta pergunta relacionada: como faço para localizar e remover linhas duplicadas de um arquivo usando expressões regulares? )

  1. Control+F

  2. Alternar "Modo de substituição"

  3. Alterne "Usar Expressão Regular" (o ícone com o .*símbolo)

  4. No campo de pesquisa , digite^(.*)(\n\1)+$

  5. No campo " substituir por ", digite$1

  6. Clique em o botão Substituir tudo("Substituir tudo").

Se a ordem das linhas é importante, então você não pode classificar

Nesse caso, recorra a uma solução fora do VS Code (veja aqui ) ou - se o seu documento não for muito grande e você não se importe de enviar spam para o botão Substituir tudo - siga as etapas anteriores, mas nas etapas 4 e 5, insira estes:
(com base em Remover linhas duplicadas específicas sem classificação )

Cuidado: Bloqueia arquivos com muitas linhas (1000+); pode causar o travamento do VS Code; pode introduzir linhas em branco em alguns casos.

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

  • substitua por :$1

e, em seguida, clique no botão "Substituir tudo" quantas vezes houver ocorrências duplicadas .

Você saberá que é o suficiente quando a contagem de linhas parar de diminuir quando você clicar no botão. Navegue até a última linha do documento para ficar de olho nisso.

Marc.2377
fonte
4
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?fez meu vscode travar .... Eu fiz um Find in one file 229 linhas. :(
Hickory420 de
@ Hickory420 Eu testei em minha máquina com 1000 linhas (20 caracteres aleatórios) e não tive nenhum travamento, mas na verdade um thread bloqueou com 100% de carga de CPU por alguns segundos em cada passagem. Sim, isso é dificilmente prático para arquivos grandes.
Março 2377 de
Obrigado por isso. Você pode explicar o regex ^(.*)(\n\1)+$. Depois de remover as linhas duplicadas, desejo examinar todas as linhas com primeira coluna duplicada no csv e modificar o regex.
Urvah Shabbir
1
Uau, eu sinto que sou muito bom em regex e isso ainda me surpreendeu, ótima resposta!
electrovir
@UrvahShabbir, uma explicação para essa parte da regex é fornecida no link de perguntas e respostas . A minha só é diferente porque a \r?parte da outra resposta não é realmente necessária.
Marc.2377
66

Aqui está uma extensão muito interessante: Transformer

Recursos:

  • Linhas Únicas
  • Linhas exclusivas como novo documento
  • Linhas de Filtro
  • Filtrar linhas como novo documento
  • Classificar linhas
  • Classificar linhas por comprimento
  • Alinhar ao Cursor
  • Alinhar CSV
  • CSV compacto
  • Copiar para um novo documento
  • Selecione as linhas
  • Linhas como JSON
  • Linhas de corte
  • Contar linhas duplicadas como novo documento
  • Macros

Para remover linhas duplicadas:

  • Remove linhas duplicadas do documento

  • Opera na seleção ou bloco atual se nenhuma seleção

Eu não brinquei muito com ele além do comando "Unique Lines", mas parece muito bem feito (incluindo tentar um gravador de macro!).

Marca
fonte
26

Para adicionar à resposta de @ Marc.2377.

Se a ordem é importante e você não se importa em manter apenas a última das linhas duplicadas, simplesmente pesquise a seguinte regexp se quiser remover apenas as linhas duplicadas não vazias

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

Se você também deseja remover linhas vazias duplicadas, use em *vez de+

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

e substitua por nada.

Captura de tela da caixa de pesquisa e substituição preenchida

Isso pegará uma linha e tentará encontrar à frente mais algumas (talvez 0) linhas seguidas exatamente pela mesma linha escolhida. Isso removerá a linha tomada.

Este é apenas um regex one-shot. Não há necessidade de spam no botão de substituição.

Skeeve
fonte
Bem sucinto
angus l
4
Agradável. Eu recomendo ^(.+\n)(?=(?:.*\n)*?\1)porque sua regex removeu uma linha vazia onde não era esperado. Votado mesmo assim.
Marc.2377
Boa pegada ... OTOH: linhas vazias duplicadas também são duplicatas;)
Skeeve
1
@Skeeve Vamos, só um pequeno obrigado pela sua resposta útil e Tudo por uma comunidade melhor :)
Zaman
1
xxx(?=…)é uma comparação antecipada. Portanto, ele garante que tudo o que segue "xxx" corresponde a "...", mas não avança a pesquisa. (?:…)é apenas um colchete que não conta na contagem de colchetes. .*\né um padrão para uma linha (possivelmente vazia). *significa que pode haver várias linhas, mesmo nenhuma. O ?após o asterisco ( *) significa que queremos o mínimo de linhas possível. Como \1segue esta expressão, o efeito é que olhamos adiante para todas as linhas que não correspondem \1até encontrarmos uma linha correspondente \1. Espero que isso deixe isso claro.
Skeeve
22

Eu apenas tive o mesmo problema e encontrei o pacote de código do Visual Studio "Classificar linhas". Consulte o mercado de código do Visual Studio para obter detalhes (por exemplo, linhas de classificação ).

Este pacote tem a opção "Classificar linhas (únicas)", que resolveu isso para mim. Tome cuidado com quaisquer espaços em branco no início / fim das linhas. Eles influenciam se as linhas são consideradas únicas ou não.

SimonAx
fonte
marketplace.visualstudio.com/… também deve funcionar.
kcpr de
1
Parece que a extensão não tem mais a capacidade de remover entradas duplicadas. Combinar isso com a resposta de @ Marc-2377 parece funcionar para mim.
Dan Atkinson,
12

Instale a extensão DupChecker , clique F1e digite "Verificar Duplicatas".

Ele verificará se há duplicatas e perguntará se você deseja removê-las.

perfecto25
fonte
11

Tente localizar e substituir por uma expressão regular .

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

  • Substituir: $1$2

É possível introduzir alguma variação no primeiro grupo.

Lavock
fonte
-3

Na verdade, não no Visual Studio Code, mas se funcionar, funcionará.

  1. Abra uma nova planilha do Excel
  2. Cole os dados em uma coluna
  3. Vá para a guia Dados
  4. Selecione a coluna de dados (se ainda não o fez)
  5. Clique em Remover Duplicados (um pouco no meio da barra)
  6. Clique OKpara remover duplicatas.

Não é a melhor resposta, pois você especificou o código do Visual Studio, mas como eu disse: Se funcionar, funciona :)

NostraDavid
fonte
Você poderia torná-lo mais relevante fornecendo um script que pode ser chamado diretamente do Visual Studio Code. Em outras palavras, automatiza esse processo. Não sei se é possível, mas um script que invocaria o Excel por meio de suas interfaces COM expostas. Isso tornaria essa resposta muito mais valiosa, pois seria um exemplo de como aproveitar outros aplicativos para fazer coisas legais.
Peter Mortensen