Removendo linhas duplicadas no Notepad ++

595

É possível remover linhas duplicadas no Notepad ++, deixando apenas uma única ocorrência de uma linha?

UGEEN
fonte

Respostas:

760

O Notepad ++ pode fazer isso, desde que você queira classificar por linha e remover as linhas duplicadas ao mesmo tempo.

Você precisará do plug-in TextFX. Isso costumava ser incluído nas versões mais antigas do Notepad ++, mas se você tiver uma versão mais recente, poderá adicioná-la no menu acessando Plugins -> Plugin Manager -> Show Plugin Manager -> Available tab -> TextFX -> Install. Em alguns casos, também pode ser chamado TextFX Characters, mas é a mesma coisa

As caixas de seleção e botões necessário agora aparecerá no menu em: TextFX -> TextFX Tools.

Verifique se a opção "classificar saídas apenas únicas ..." está marcada. Em seguida, selecione um bloco de texto ( Ctrl+ Apara selecionar o documento inteiro). Por fim, clique em "classificar linhas com distinção entre maiúsculas e minúsculas" ou "classificar linhas com distinção entre maiúsculas e minúsculas"

layout de menu em n ++

Colin Pickard
fonte
32
Plugin incrivelmente poderoso, apesar de sua "idade". Espero que NUNCA remova esse da oferta padrão de plug-in da NPP. O cara que pensou em todos os recursos deste plug-in era meio que "visionário".
GeertVc
7
Mais poderoso que o excel.
Vasu
6
E a versão do Notepad ++ x64? O plug-in TextFX x64-version não existe
Geograph
15
O TextFx não está na versão de 64 bits.
Rhyous 23/03/19
4
@ Geograph E não haverá plug-in de 64 bits do TextFx, veja esta nota . Portanto, seria bom saber se existe um plug-in alternativo que fornece remoção de classificação e duplicada.
Robert
641

Desde o Notepad ++ versão 6, você pode usar esse regex na pesquisa e substituir o diálogo:

^(.*?)$\s+?^(?=.*^\1$)

e substitua por nada . Isso deixa de todas as linhas duplicadas a última ocorrência no arquivo.

Nenhuma classificação é necessária para isso e as linhas duplicadas podem estar em qualquer lugar do arquivo!

Você precisa verificar as opções "Expressão regular" e ". Corresponde à nova linha":

Bloco de notas ++ Substituir diálogo

  • ^ corresponde ao início da linha.

  • (.*?)corresponde a qualquer caractere 0 ou mais vezes, mas o mínimo possível (corresponde exatamente à linha, isso é necessário devido à opção ". corresponde à nova linha"). A linha correspondente é armazenada, devido aos colchetes ao redor e acessíveis usando\1

  • $ corresponde ao final da linha.

  • \s+?^ esta parte corresponde a todos os caracteres de espaço em branco (novas linhas!) até o início da próxima linha ==> Isso remove as novas linhas após a linha correspondente, para que nenhuma linha vazia esteja lá após a substituição.

  • (?=.*^\1$)Esta é uma afirmação positiva. Esta é a parte importante desse regex, uma linha é correspondida apenas (e removida) quando existe exatamente a mesma linha seguindo em outro lugar no arquivo.

stema
fonte
10
oh, este é brilhante, ele ainda exclui linhas vazias, eu estou macroing-lo neste momento :)
Aprillion
66
Apenas remove TODAS as linhas de um arquivo em alguns casos.
SerG
3
Existe alguma maneira de remover a ÚLTIMA ocorrência? Isso corresponde a todos, exceto o último ...
Cullub 23/09
28
No meu caso, em que essa solução removeu todas as linhas, desmarcar a opção . matches newlinefez o truque.
Kuitsi
3
@SerG Em alguns casos, não funcionou para mim também, mas quando eu removido "jogos de nova linha" que fez :)
Davidenko
95

Se as linhas estiverem imediatamente uma após a outra, você poderá usar uma substituição de regex:

Padrão de Pesquisa: ^(.*\r?\n)(\1)+

Substituir com: \1

Grant Peters
fonte
1
Talvez outros tiveram sorte com isso, mas para mim ^ \ 1 resultados em "não consigo encontrar o texto" (* \ n.)
b1nary.atr0phy
4
@ b1naryatr0phy ter certeza de que "Modo de Pesquisa" definido como "expressão regular", eu também atualizou o padrão para que ele possa lidar com estilo finais de linha janelas
Grant Peters
3
o notepad ++ possui um mecanismo de regex leve, não permite funções avançadas, nem mesmo o "? ou \ r \ n", pois funciona apenas em uma única linha e você usa $ para os caracteres \ r \ n
Stefan Rogin
3
isso elimina um por um. Você deve repeti-lo várias vezes. Eu me pergunto por \ n + -> \ n não funciona (pensei que relata muitas substituições)
Val
2
@Val, se você fizer a parte back-referência da partida um grupo com 1-ou-mais partidas necessários, o padrão irá corresponder a N linhas duplicadas contíguas de cada vez:^(.*\r?\n)(\1)+
Kenigmatic
37

Notepad ++

-> Substituir janela

Verifique se no modo Pesquisa você selecionou o botão de opção Expressão regular

Encontre o que:

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

Substituir com:

$ 1

Antes:

e nós pensamos lá

e nós pensamos lá

única linha

é possível

é possível

Depois de:

e nós pensamos lá

única linha

é possível

blueberry0xff
fonte
2
O arquivo não precisa ser classificado para que isso funcione?
Peter Mortensen
isso é brilhante
Remo Liechti 19/02
30

Se você não se importa com a ordem das linhas (o que eu acho que não), use uma caixa Linux / FreeBSD / Mac OS X / Cygwin e faça:

$ cat yourfile | sort | uniq > yourfile_nodups

Em seguida, abra o arquivo novamente no Notepad ++.

Pablo Santa Cruz
fonte
3
Não funciona no Windows 7.'cat' is not recognized as an internal or external command, operable program or batch file.
Iain Samuel McLean Elder
2
@Iain Elder: cat é um utilitário Unix padrão, e é por isso que esta resposta especifica que ele funciona no Linux, FreeBSD e MacOSX. A resposta também sugere Cygwyn: Este é um programa do Windows que oferece um shell de estilo unix e, com ele, gato. Para encurtar a história (tarde demais!): O Win 7 precisa do Cygwin para fazer isso.
Travis Clark
11
No Windows você tem PowerShell:cat yourfile | sort -Unique
Elazar
9
Estes são bons exemplos de "o uso gratuito de gatos". Esqueça o utilitário cat e use o redirecionamento de arquivo da seguinte maneira: classifique <seuarquivo | uniq> yourfile_nodups
scott8035
1
@ scott8035, eu concordo que cat não serve para executar esse comando, mas acho útil começar com cat ao descobrir uma longa sequência de comandos não óbvios, como arquivo cat | sed ... | sed ... | sed ... e assim por diante. Então, eu diria que pode haver razões para usar o gato. É claro que o gato pode ser removido no final, mas alguns são preguiçosos para isso.
FORTRAN
17

As últimas versões do Notepad ++ aparentemente não incluem o plugin TextFX. Para usar o plug-in para classificar / eliminar duplicatas, o plug-in deve ser baixado e instalado (mais envolvido) ou adicionado usando o gerenciador de plug-ins.

A) Maneira fácil (como descrito aqui ).

Plugins -> Gerenciador de Plugins -> Mostrar Gerenciador de Plugins -> guia Disponível -> Caracteres TextFX -> Instalar

B) Maneira mais envolvida, se outra versão for necessária ou a maneira mais fácil não funcionar.

  1. Faça o download do plugin no SourceForge:

    http://downloads.sourceforge.net/project/npp-plugins/TextFX/TextFX%20v0.26/TextFX.v0.26.unicode.bin.zip

  2. Abra o arquivo zip e extraia o NppTextFX.dll

  3. Coloque o NppTextFX.dll no diretório de plugins do Notepad ++, como:
    C: \ Arquivos de Programas \ Notepad ++ \ plugins

  4. Inicie o Notepad ++ e o TextFX será um dos itens de menu do arquivo (como visto na Resposta nº 1 acima, por Colin Pickard)

Após instalar o plug-in TextFX, siga as instruções na resposta nº 1 para classificar e remover duplicatas.

Além disso, considere configurar um atalho de teclado usando Configurações> Mapeador de atalhos se você usar esse comando com freqüência ou desejar replicar um atalho de teclado, como F9 no TextPad para classificação.

a leste
fonte
No bloco de notas ++ 7.6, o plug-in deve ser adicionado a C:\Users\<your_user>\AppData\Local\Notepad++\plugins\NppTextFX. Fora isso, isso ainda funciona bem.
P_W999
14

Na versão 7.8, você pode fazer isso sem nenhum plug-in - Editar -> Operações de linha -> Remover linhas duplicadas consecutivas. Você precisará classificar o arquivo para colocar linhas duplicadas em ordem consecutiva antes que isso funcione, mas funciona como um encanto.

As opções de classificação estão disponíveis em Editar -> Operações de linha -> Classificar por ...

dr.nixon
fonte
7

Você pode precisar de um plugin para fazer isso. Você pode tentar a linha de comando cc.ddl(excluir linhas duplicadas) do ConyEdit . É um plug-in de editor cruzado para os editores de texto, incluindo o Notepad ++.

Com o ConyEdit em execução em segundo plano, siga as etapas abaixo:

  1. digite a linha de comando cc.ddlno final do texto.
  2. copie o texto e a linha de comando.
  3. colar, então você verá o que deseja.

Exemplo
insira a descrição da imagem aqui

Donald
fonte
5

Procure a expressão regular: \b(\w+)\b([\w\W]*)\b\1\b

Substitua por: $1$2

Pressione o botão Substituir até que não haja mais correspondências para a expressão regular em seu arquivo.

Hesham Eraqi
fonte
Criou um arquivo de teste para tentar isso, mas a expressão regular não funcionou de maneira confiável para realizar o trabalho.
RockPaperLizard
Você poderia fornecer um exemplo que falhe para que eu possa melhorar minha resposta?
Hesham Eraqi 3/08/19
4

Nenhum funcionou para mim.

Uma solução é:

Substituir

^(.*)\s+(\r?\n\1\s+)+$

com

\1
Manohar Reddy Poreddy
fonte
Criou um arquivo de teste para tentar isso, mas a expressão regular não funcionou de maneira confiável para realizar o trabalho.
RockPaperLizard
Para todos os meus dados, funcionou bem. Eu esqueci qual era a minha solução. Adicione mais detalhes onde houve falha para que outras pessoas possam melhorar esse regex.
Manohar Reddy Poreddy 20/03/16
Criei um arquivo para que cada linha tivesse um número inteiro entre 0 e 999, em ordem aleatória, às vezes com duplicatas. Não removeu a maioria das duplicatas e não removeu nenhuma duplicata que não fosse seqüencial.
RockPaperLizard
1
Por favor, forneça 2 exemplos para quem trabalha e para quem não trabalha. Isso ajudará alguém.
Manohar Reddy Poreddy 20/03/16
1
porque ^(.*)\s+(\r?\n\1\s+)+$e não ^(.*)\s*(\r?\n\1\s*)+$?
Mark Ch
2

O gerenciador de plug-ins está indisponível no momento (não vem com a distribuição) para o Notepad ++. Você deve instalá-lo manualmente ( https://github.com/bruderstein/nppPluginManager/releases ) e, mesmo se o fizer, muitos plug-ins não estarão mais disponíveis (nenhum TextFX).

Talvez haja outro plugin que contenha a funcionalidade necessária. Fora isso, a única maneira de fazer isso no Notepad ++ é usar um regex especial para fazer a correspondência e depois substituir (Ctrl + F→ guia Substituir ).

Embora existam muitas funcionalidades disponíveis no item de menu Editar (aparar, remover linhas vazias, classificar, converter EOL), não há operação "única" disponível.

Se você possui o Windows 10, pode ativar o Bash (basta digitar Ubuntu na Microsoft Store e siga as instruções na descrição para instalá-lo) e usá-lo cat your_file.txt | sort | uniq > your_file_edited.txt. É claro que você deve estar no mesmo diretório de trabalho que "seu_arquivo.txt" ou fazer referência a ele pelo caminho.

Patronauta
fonte