Responder1
Forneci várias soluções possíveis para sua consideração. Por favor, me perdoe se eu repassar algo que você já sabe. =)
DR
A partir do Notepad++ v7.7.1, o Notepad++ possui um recurso chamadoRemover linhas duplicadas consecutivasque faz o mesmo que as outras duas soluções fornecidas abaixo (ou seja, remove linhas duplicadas consecutivas).
Ele pode ser acessado comEditar → Operações de linha → Remover linhas duplicadas consecutivas.
VerA resposta de Bartlebyabaixo para ver um exemplo de expressão regular que desduplicará as linhas sem classificar.
Resposta original
De acordo com o comentário de @máté-juhász, a resposta aceita para issoPergunta StackOverflowfuncionará com seus dados de exemplo.
Em essência:
AbrirPesquisar → Substituir...( Ctrl+ H) no Bloco de Notas++.
No campo "Localizar:", digite o seguinteexpressão regular:
^(.*?)$\s+?^(?=.*^\1$)
Deixe o campo “Substituir por:” em branco e certifique-se de marcar “Expressão regular” nas opções de “Modo de pesquisa”.
Quando estiver pronto para remover suas linhas, clique em "Substituir tudo".
Observe que a resposta original parece indicar que a . matches newline
opção deve ser marcada, mas algumas pessoas nos comentários aparentemente tiveram mais sorte em deixá-la desmarcada. Para seus dados, deixei desmarcado e pareceu funcionar bem.
ex. Usando expressões regulares
Usando uniq
Como alternativa, assumindo que nenhuma outra opção atenda às suas necessidades, se você tiver uma porta Windows do sistema baseado em Unixúnicoutilitário, você poderia integrá-lo ao seu fluxo de trabalho com o Notepad++.
Resumindo, uniq
executa a mesma função que a expressão regular acima, mas de uma forma potencialmente mais confiável. A desvantagem é que incorporá-lo ao Notepad ++ é um pouco complicado. Com isso em mente, se você quiser experimentar, as etapas básicas estão descritas a seguir.
Tornando-se único
Para começar, você precisa de uma cópia uniq
para Windows. Pode haver várias opções disponíveis para você, mas, para simplificar, posso sugerir aPacote GnuWin32 CoreUtilsque inclui uniq
. Atualmente você pode baixar uminstalador levese você optar por não baixar e combinar as versões compactadas dos componentes do pacote CoreUtils por conta própria.
Como dica, para cada etapa da solução que envolva uniq
, eu pularia o uso de caminhos com espaços. O Unix geralmente trata espaços em nomes de diretórios de maneira diferente do Windows, portanto, utilitários portados desse ambiente podem ter problemas com eles.
Para referência, não tenho certeza de quais (se houver) limites de tamanho de arquivo podem ser aplicados à compilação GnuWin32 do uniq
, mas costumo usá-lo para arquivos de texto com pelo menos vários megabytes de dados (geralmente várias centenas de milhares de linhas) com facilidade.
Usando uniq com Notepad++
Depois de uniq
instalado, coloque algo semelhante às seguintes linhas em um arquivo em lote:
C:\path\to\uniq.exe %* > C:\temp\uniq_tmp.txt
notepad++ C:\temp\uniq_tmp.txt
exit()
Salve este arquivo em lote em um diretório permanente com o qual você se sinta confortável. Para fins de referência, chamarei issouniq_npp.bat. Observe que “temp” pode ser qualquer pasta, mas “tmp” e “temp” geralmente já existem no Windows. Da mesma forma, "uniq_tmp.txt" pode ter qualquer nome que você desejar, desde que seja usado de forma consistente.
Depois de salvaruniq_npp.bat, estaremos prontos para integrar sua funcionalidade ao Notepad++. Para fazer isso, abra o Notepad++Correr...menu ( F5) e digite algo semelhante ao seguinte no campo que aparece:
cmd /k C:\path\to\uniq_npp.bat "$(FULL_CURRENT_PATH)"
Você pode testar seu comando do Notepad ++ antes de salvá-lo clicando no botão "Executar" mais à esquerda.
ex. Executar... Caixa de diálogo
Caso contrário, clique em "Salvar..." e nomeie seu comando apropriadamente. Você pode fornecer um atalho de teclado se desejar, mas não é obrigatório. Clique em "OK" para manter suas configurações de comando e colocá-lo noCorrer...menu suspenso para uso posterior.
ex. Executar menu suspenso
Supondo que seja do seu interesse, tenho uma breve visão geral dos detalhes de como a uniq
solução funciona na seção "Notas" no final desta resposta.
Ressalvas
Uma coisa importante a lembrar sobre essas soluções uniq
é queabsolutamente requerum caminho para um arquivo salvo no disco (o documento não pode ser aberto apenas no Notepad++).
Isso não é um problema com um arquivo existente que você abriu, mas se você criar um novo arquivo ou alterar um original existente, será necessárioSalvarprimeiro antes de executar seuuniq_npp.batarquivo. Caso contrário, a operação falhará e quaisquer novos dados não serão classificados.
Como uma pequena vantagem, provavelmente vale a pena mencionar que esta limitação de salvamento não se aplica à opção de expressão regular acima.
Notas
Ordenação
As soluções oferecidas (ou seja, a expressão regular inicial e uniq
) exigem que linhas duplicadas apareçam diretamente uma acima da outra para serem removidas, por exemplo:
duplicate line X
duplicate line X
Isso significa que é importante classificar seus dados antes de aplicar uma dessas operações. Presumo que você já esteja fazendo isso com base nos dados de exemplo, mas vale a pena mencionar de qualquer maneira.
Macros do Bloco de Notas++
Como uma pequena sugestão, como o Notepad++ não possui nenhum atalho de teclado real para suas operações internas de classificação de linhas, você pode querer gravar uma macro para ajudar na classificação. Particularmente, você pode gravar umEditar → Selecionar tudo( Ctrl+ A) operação e depois escolha uma dasEditar → Operações de linha → Classificar linhas lexicograficamenteopções.
Para a uniq
solução, também pode valer a pena considerar gravar uma operação "Salvar" como etapa final de uma macro de classificação. Observe também que as etapas para a opção de expressão regular (abrir a caixa de diálogo Substituir, inserir a expressão regular, etc.) também podem ser gravadas em uma macro útil.
Como funciona a solução uniq
Em resumo:
A linha "Run..." gera uma janela de comando (
cmd /k
), chamauniq_npp.bate fornece o caminho para onde o arquivo atual que você selecionou está armazenado.Emuniq_npp.bat, esse caminho é capturado por meio do
%*
curinga passado parauniq
. Os dados desduplicadosuniq
são então redirecionados (>
) para "uniq_tmp.txt".Por fim, o arquivo em lote abre esse texto limpo em uma nova guia do Notepad++ e a janela de comando é fechada via
exit()
.
Melhorias em uniq_npp.bat (?)
Em relação à classificação, outra opção é pular o uso do Notepad++ para classificar tudo junto. Você potencialmente perde alguma flexibilidade no processo em relação às opções de classificação, mas pode classificar itens apenas como uma etapa extra em seu arquivo em lote por meio doClassificação do Windowscomando. Para adicionar esta etapa, você pode modificar a primeira linha douniq_npp.batdo seguinte modo:
sort %* | C:\path\to\uniq.exe > C:\temp\uniq_tmp.txt
Isso simplesmente canaliza os dados classificados de sort
para uniq
. Como você pode ver, sort
agora captura inicialmente o caminho dos dados, em vez de uniq
.
Outra ideia é (possivelmente) usar o %*
curinga como parte de uma operação de string para obter o nome do arquivo original e substituir, por exemplo, "uniq_tmp.txt" por algo como "original-filename_uniq.txt" para torná-lo mais... único.
Potenciais armadilhas
Por padrão, o Windows
sort
classificará os números como, por exemplo1 11 2 21
se não forem precedidos de 0 (por exemplo 01, 02, 011, 021
, ).
- Embora o pacote GnuWin32 CoreUtils venha com uma porta doClassificação Unixutilitário (que tem opções mais robustas que o Windows
sort
), esta implementação específica (ao contrário da maioria dos utilitários GnuWin32) me parece um pouco ruim no Windows. No entanto, se você usar uma porta Windows diferente da versão Unix dosort
, esse problema pode não se aplicar e pode ser uma opção melhor no geral.
Responder2
Descobri que isso funciona bem para itens que não estão em ordem:
Procurar:
(?s)^(.*?)$\s+?^(?=.*^\1$)
Clique em 'Substituir tudo' sem nada no campo 'Substituir por:'.
Editar:
Aqui está o passo a passo:
(?s) Ponto também corresponde à nova linha.
^ Início da linha
(.*?)$ Estabeleça o primeiro grupo de captura combinando zero ou mais de qualquer caractere, de forma não gananciosa, até o primeiro final de linha encontrado.
\s+? Combine um ou mais caracteres de espaço em branco, sem avidez
^ Início da linha (de novo)
(?= Lookahead positivo com um grupo sem captura (esse padrão deve ser correspondido, mas não é armazenado).
.*^\1$) Combine zero ou mais caracteres, avidamente, continuando até uma nova linha onde a linha inteira corresponda ao primeiro grupo de captura.
Assim, a regex cria um grupo de captura e então pesquisa todas as linhas do documento até encontrar uma que corresponda precisamente a essa linha e substitua a linha original por nada.
Adendo: não estava pensando nisso na hora e peço desculpas ao criador do Regex, mas acreditoScottestá correto porque eu estava usando uma versão ligeiramente modificada de um regex que outra pessoa criou. Se eu adivinhasse sua origem, acho que provavelmente seria a resposta realmente creditada no link que ele forneceu, que pode ser encontradoaqui.
Então, para encerrar, aceite minhas desculpas por:
- Não dar crédito onde é devido. Eu não estava pensando nisso naquele momento, mas deveria.
- Não explicar completamente a resposta que forneci, o que aumentaria a compreensão de alguém sobre o que está acontecendo, para que pudesse usar essas informações para outros problemas.
- Não respondendo ao comentário de Scott mais rapidamente. Não sou muito especialista no uso deste site (daí minha pontuação baixa) e não pensei em verificar minhas notificações até hoje.
Mea culpa!
Responder3
Obrigado, mas regex e uniq detectaram apenas linhas duplicadas próximas uma da outra. Usando este script awk como awkuniq-npp.bat, ele é compatível com o Notepad++. Arquivo bat de 4 linhas:
C:\pathto\awk.exe '(a[$0]++==0)' %* > %*.1 del %* mover %*.1 %* saída()Comando para executar:
cmd /k C:\pathto\awkuniq-npp.bat "$(FULL_CURRENT_PATH)"
Ele usa recarga automática após del/move para substituir o mesmo nome de arquivo
Responder4
Utilizo a seguinte regex de busca/substituição (depois de ordenar as linhas), acho mais intuitivo de entender:
Find: (.*)\r?\n(\1\r?\n)+
Replace with: \1\r\n
Explicação:
- procure por "qualquer coisa" (uma linha de texto) seguida de uma nova linha (\n ou \r\n): .\r?\n
- mantém o conteúdo da linha em uma variável: (.)\r?\n
- procure por reocorrências da mesma linha uma ou mais vezes: (.*)\r?\n(\1\r?\n)+
Substituição: - Substitua tudo acima apenas pela própria linha e pela nova linha: \1\r\n
Espero que ajude,
sb3k