Rimozione di righe duplicate in Notepad ++


595

È possibile rimuovere le righe duplicate in Notepad ++, lasciando una sola occorrenza di una riga?

Risposte:


760

Notepad ++ può farlo, a condizione che si desideri ordinare per riga e rimuovere contemporaneamente le righe duplicate.

Sarà necessario il plug-in TextFX. In precedenza era incluso nelle versioni precedenti di Notepad ++, ma se si dispone di una versione più recente, è possibile aggiungerlo dal menu accedendo a Plugins -> Plugin Manager -> Show Plugin Manager -> Available tab -> TextFX -> Install. In alcuni casi può anche essere chiamato TextFX Characters, ma questa è la stessa cosa

Le caselle di controllo ei pulsanti necessari ora apparirà nel menu sotto: TextFX -> TextFX Tools.

Assicurati che "ordina output solo unici ..." sia selezionato. Successivamente, seleziona un blocco di testo ( Ctrl+ Aper selezionare l'intero documento). Infine, fai clic su "ordina le linee maiuscole e minuscole" o "ordina le linee maiuscole e minuscole"

layout del menu in n ++


32
Plug-in incredibilmente potente, nonostante la sua "età". Spero che non lo rimuoveranno MAI dall'offerta di plug-in NPP standard. Il ragazzo che pensava a tutte le funzionalità di questo plug-in, era una specie di "visionario".
GeertVc,

7
Più potente di Excel.
Vasu,

6
Che dire della versione x64 di Notepad ++? Plugin TextFX versione x64 non esistente
Geografia

15
TextFx non è nella versione a 64 bit.
Rhyous,

4
@Geograph E non ci sarà nessun plugin a 64 bit di TextFx vedere questa nota . Pertanto sarebbe bene sapere se esiste un plug-in alternativo che fornisce la rimozione di ordinamenti e duplicati.
Robert,

641

Da Notepad ++ versione 6 è possibile utilizzare questo regex nella finestra di ricerca e sostituzione:

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

e sostituire con niente . Ciò lascia da tutte le righe duplicate l'ultima occorrenza nel file.

Non è necessario alcun ordinamento per questo e le righe duplicate possono trovarsi ovunque nel file!

Devi selezionare le opzioni "Espressione regolare" e ". Corrisponde a nuova riga":

Blocco note ++ Sostituisci dialogo

  • ^ corrisponde all'inizio della riga.

  • (.*?)corrisponde a qualsiasi carattere 0 o più volte, ma il minor numero possibile (corrisponde esattamente alla riga, ciò è necessario a causa dell'opzione ". abbina nuova riga"). La riga corrispondente viene memorizzata, a causa delle parentesi attorno e accessibile tramite\1

  • $ corrisponde alla fine della riga.

  • \s+?^ questa parte corrisponde a tutti i caratteri di spazi bianchi (nuove righe!) fino all'inizio della riga successiva ==> In questo modo vengono rimosse le nuove righe dopo la riga corrispondente, in modo che non vi siano righe vuote dopo la sostituzione.

  • (?=.*^\1$)questa è un'affermazione positiva. Questa è la parte importante in questa regex, una riga viene abbinata (e rimossa) solo quando c'è esattamente la stessa riga che segue da qualche altra parte nel file.


10
oh, questo è geniale, cancella anche le righe vuote, lo sto macro proprio in questo momento :)
Aprillion

66
In alcuni casi rimuove TUTTE le righe di un file.
SerG,

3
C'è un modo per rimuovere l'ULTIMA occorrenza? Questo corrisponde a tutti tranne l'ultimo ...
Cullub,

28
Nel mio caso in cui questa soluzione ha rimosso tutte le linee, deselezionando . matches newlineil trucco.
Kuitsi,

3
@SerG In alcuni casi non ha funzionato anche per me, ma quando ho rimosso "match newline" ha funzionato :)
Davidenko,

95

Se le righe sono immediatamente una dopo l'altra, puoi usare una regex sostitutiva:

Modello di ricerca: ^(.*\r?\n)(\1)+

Sostituirlo con: \1


1
Forse altri hanno avuto fortuna con questo, ma per me ^ (. * \ N) \ 1 risulta in "Impossibile trovare il testo"
b1nary.atr0phy

4
@ b1naryatr0phy assicurati di avere "Modalità di ricerca" impostata su "Espressione regolare", ho anche aggiornato il modello in modo che possa gestire le terminazioni di linea in stile Windows
Grant Peters

3
notepad ++ ha un motore regex leggero, non consente funzioni avanzate, nemmeno il "? o \ r \ n" poiché funziona solo su una singola riga e usi $ per i caratteri \ r \ n
Stefan Rogin

3
questo elimina uno per uno. Devi ripeterlo più volte. Mi chiedo perché \ n + -> \ n non funziona (pensato che riporta molti sostituti)
Val

2
@Val, se si rende la parte di riferimento indietro della partita un gruppo con 1 o più corrispondenze richieste, il modello corrisponderà a N righe duplicate contigue alla volta:^(.*\r?\n)(\1)+
Kenigmatic

37

Notepad ++

-> Sostituisci finestra

Assicurarsi che nella modalità di ricerca sia stato selezionato il pulsante di opzione Espressione regolare

Trovare cosa:

^ (. *) (\ R? \ N \ 1) + $

Sostituirlo con:

$ 1

Prima:

e pensiamo lì

e pensiamo lì

linea singola

È possibile

È possibile

Dopo:

e pensiamo lì

linea singola

È possibile


2
Non è necessario che il file sia ordinato per farlo funzionare?
Peter Mortensen,

questo è geniale
Remo Liechti,

30

Se non ti interessa l'ordine delle righe (cosa che non credo tu faccia), puoi usare una scatola Linux / FreeBSD / Mac OS X / Cygwin e fare:

$ cat yourfile | sort | uniq > yourfile_nodups

Quindi riaprire il file in Notepad ++.


3
Non funziona su Windows 7.'cat' is not recognized as an internal or external command, operable program or batch file.
Iain Samuel McLean Elder l'

2
@Iain Elder: cat è un'utilità Unix standard, motivo per cui questa risposta specifica che funziona su Linux, FreeBSD e MacOSX. La risposta suggerisce anche Cygwyn: questo è un programma Windows che ti offre una shell in stile unix e, con essa, cat. Per farla breve (troppo tardi!): Win 7 ha bisogno di Cygwin per farlo.
Travis Clark,

11
In Windows hai PowerShell:cat yourfile | sort -Unique
Elazar

9
Questi sono buoni esempi di "uso gratuito del gatto". Dimentica l'utilità cat e usa semplicemente il reindirizzamento dei file in questo modo: sort <yourfile | uniq> yourfile_nodups
scott8035

1
@ scott8035, sono d'accordo sul fatto che cat non sia utile per eseguire quel comando, ma trovo spesso utile iniziare con cat quando capisco una lunga sequenza di comandi non ovvi, come cat file | sed ... | sed ... | sed ... e così via. Quindi direi che potrebbero esserci dei motivi per usare cat. Naturalmente il gatto può essere rimosso alla fine, ma alcuni sono troppo pigri per quello.
FORTRAN,

17

Le ultime versioni di Notepad ++ apparentemente non includono affatto il plugin TextFX. Per utilizzare il plug-in per ordinare / eliminare i duplicati, il plug-in deve essere scaricato e installato (più interessato) o aggiunto utilizzando il gestore plug-in.

A) Modo semplice (come descritto qui ).

Plugin -> Plugin Manager -> Mostra Plugin Manager -> scheda Disponibile -> Caratteri TextFX -> Installa

B) Modo più coinvolto, se è necessaria un'altra versione o il modo semplice non funziona.

  1. Scarica il plug-in da SourceForge:

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

  2. Aprire il file zip ed estrarre NppTextFX.dll

  3. Inserire NppTextFX.dll nella directory dei plug-in Notepad ++, ad esempio:
    C: \ Programmi \ Notepad ++ \ plugins

  4. Avvia Notepad ++ e TextFX sarà una delle voci del menu file (come visto nella risposta n. 1 sopra di Colin Pickard)

Dopo aver installato il plug-in TextFX, seguire le istruzioni nella risposta n. 1 per ordinare e rimuovere i duplicati.

Inoltre, considera l'impostazione di una scorciatoia da tastiera usando Impostazioni> Mappatore scorciatoia se usi questo comando frequentemente o vuoi replicare una scorciatoia da tastiera, come F9 in TextPad per l'ordinamento.


In notepad ++ 7.6, il plug-in deve essere aggiunto a C:\Users\<your_user>\AppData\Local\Notepad++\plugins\NppTextFX. A parte questo, funziona ancora bene.
P_W999,

14

Nella versione 7.8, puoi farlo senza plug-in - Modifica -> Operazioni sulla linea -> Rimuovi linee duplicate consecutive. Dovrai ordinare il file per posizionare le linee duplicate in ordine consecutivo prima che funzioni, ma funziona come un incantesimo.

Le opzioni di ordinamento sono disponibili in Modifica -> Operazioni linea -> Ordina per ...


7

Potrebbe essere necessario un plugin per farlo. Puoi provare la riga di comando cc.ddl(elimina righe duplicate) di ConyEdit . È un plug-in cross-editor per gli editor di testo, incluso Notepad ++.

Con ConyEdit in esecuzione in background, attenersi alla seguente procedura:

  1. inserisci la riga di comando cc.ddlalla fine del testo.
  2. copia il testo e la riga di comando.
  3. incolla, quindi vedrai quello che vuoi.

Esempio
inserisci qui la descrizione dell'immagine


5

Cerca l'espressione regolare: \b(\w+)\b([\w\W]*)\b\1\b

Sostituiscilo con: $1$2

Premi il pulsante Sostituisci fino a quando non ci sono più corrispondenze per l'espressione regolare nel tuo file.


Creato un file di prova per provare questo, ma l'espressione regolare non ha funzionato in modo affidabile per completare il lavoro.
RockPaperLizard

Potresti fornire un esempio che non riesce in modo da poter migliorare la mia risposta?
Hesham Eraqi,

4

Nessuno ha funzionato per me.

Una soluzione è:

Sostituire

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

con

\1

Creato un file di prova per provare questo, ma l'espressione regolare non ha funzionato in modo affidabile per completare il lavoro.
RockPaperLizard

Per tutti i miei dati, ha funzionato bene. Ho dimenticato quale fosse la mia soluzione. Aggiungi ulteriori dettagli in caso di errore in modo che altre persone possano migliorare questa regex.
Manohar Reddy Poreddy

Ho creato un file in modo che ogni riga avesse un numero intero compreso tra 0 e 999, in ordine casuale, a volte con duplicati. Non rimuoveva la maggior parte dei duplicati e non rimuoveva i duplicati che non erano sequenziali.
RockPaperLizard

1
Fornisci 2 esempi per quelli che funzionano e quelli che non funzionano. Aiuterà qualcuno.
Manohar Reddy Poreddy

1
perché ^(.*)\s+(\r?\n\1\s+)+$e no ^(.*)\s*(\r?\n\1\s*)+$?
Mark Ch,

2

Il gestore plugin non è attualmente disponibile (non viene fornito con la distribuzione) per Notepad ++. È necessario installarlo manualmente ( https://github.com/bruderstein/nppPluginManager/releases ) e anche se lo fai, molti plug-in non sono più disponibili (no TextFX).

Forse c'è un altro plugin che contiene la funzionalità richiesta. A parte questo, l'unico modo per farlo in Notepad ++ è usare un regex speciale per la corrispondenza e la sostituzione ( Ctrl+ FSostituisci scheda).

Sebbene ci siano molte funzionalità disponibili tramite Modifica voce di menu (taglio, rimozione di righe vuote, ordinamento, conversione EOL) non è disponibile alcuna operazione "unica".

Se hai Windows 10, puoi abilitare Bash (basta digitare Ubuntu in Microsoft Store e seguire le istruzioni nella descrizione per installarlo) e utilizzare cat your_file.txt | sort | uniq > your_file_edited.txt. Ovviamente devi trovarti nella stessa directory di lavoro di "your_file.txt" o fare riferimento ad essa tramite il suo percorso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.