Antwort1
Ich habe Ihnen mehrere mögliche Lösungen zur Prüfung vorgelegt. Bitte verzeihen Sie mir, wenn ich etwas wiederhole, das Sie bereits wissen. =)
Kurz zusammengefasst
Ab Notepad++ v7.7.1 verfügt Notepad++ über eine Funktion namensEntfernen Sie aufeinanderfolgende doppelte ZeilenDies bewirkt dasselbe wie die beiden anderen unten angegebenen Lösungen (d. h. es entfernt aufeinanderfolgende doppelte Zeilen).
Der Zugriff erfolgt überBearbeiten → Zeilenoperationen → Aufeinanderfolgende doppelte Zeilen entfernen.
SehenBartlebys AntwortUnten finden Sie ein Beispiel für einen regulären Ausdruck, der Zeilen ohne Sortierung dedupliziert.
Ursprüngliche Antwort
Laut dem Kommentar von @máté-juhász ist die akzeptierte Antwort daraufStackOverflow-Fragewird mit Ihren Beispieldaten funktionieren.
Im Wesentlichen:
OffenSuchen → Ersetzen...( Ctrl+ H) in Notepad++.
Geben Sie im Feld „Suchen nach:“ Folgendes einregulären Ausdruck:
^(.*?)$\s+?^(?=.*^\1$)
Lassen Sie das Feld „Ersetzen durch:“ leer und markieren Sie unter den Optionen für den „Suchmodus“ unbedingt „Regulärer Ausdruck“.
Wenn Sie bereit sind, Ihre Zeilen zu entfernen, klicken Sie auf „Alle ersetzen“.
Beachten Sie, dass die ursprüngliche Antwort darauf hinzuweisen scheint, dass die . matches newline
Option aktiviert werden sollte, aber einige Leute in den Kommentaren hatten anscheinend mehr Glück, als sie sie deaktiviert ließen. Zu Ihrer Information: Ich habe sie deaktiviert gelassen und es schien gut zu funktionieren.
Beispiel: Verwenden von regulären Ausdrücken
Verwendung von uniq
Alternativ, vorausgesetzt, keine andere Option erfüllt Ihre Anforderungen, wenn Sie einen Windows-Port des Unix-basierteneinzigartigDienstprogramm, Sie können dies möglicherweise in Ihren Arbeitsablauf mit Notepad++ integrieren.
Kurz gesagt, uniq
führt dieselbe Funktion wie der reguläre Ausdruck oben aus, aber auf eine potenziell zuverlässigere Weise. Der Nachteil ist, dass die Einbindung in Notepad++ ein bisschen mühsam ist. Wenn Sie es also ausprobieren möchten, sind die grundlegenden Schritte unten aufgeführt.
Einzigartig werden
Zu Beginn benötigen Sie eine Kopie von uniq
für Windows. Möglicherweise stehen Ihnen mehrere Optionen zur Verfügung, aber der Einfachheit halber schlage ich Folgendes vor:GnuWin32 CoreUtils-PaketDazu gehört uniq
. Sie können derzeit eineLeichtgewicht-Installerwenn Sie sich dafür entscheiden, die gezippten Versionen der CoreUtils-Paketkomponenten nicht selbst herunterzuladen und zu kombinieren.
Als Tipp: Bei jedem Schritt der Lösung, der Leerzeichen beinhaltet uniq
, würde ich die Verwendung von Pfaden mit Leerzeichen überspringen. Unix behandelt Leerzeichen in Verzeichnisnamen oft anders als Windows, sodass aus dieser Umgebung portierte Dienstprogramme möglicherweise Probleme damit haben.
Zur Information: Ich bin mir nicht sicher, welche Dateigrößenbeschränkungen (falls überhaupt) für die GnuWin32-Version von gelten uniq
, aber ich verwende sie häufig und problemlos für Textdateien mit mindestens mehreren Megabyte an Daten (oft mehrere hunderttausend Zeilen).
Verwenden von uniq mit Notepad++
Fügen Sie nach uniq
der Installation etwas Ähnliches wie die folgenden Zeilen in eine Batchdatei ein:
C:\path\to\uniq.exe %* > C:\temp\uniq_tmp.txt
notepad++ C:\temp\uniq_tmp.txt
exit()
Speichern Sie diese Batchdatei in einem festen Verzeichnis, mit dem Sie vertraut sind. Zu Referenzzwecken werde ich dies nennenuniq_npp.bat. Beachten Sie, dass „temp“ jeder beliebige Ordner sein kann, „tmp“ und „temp“ jedoch häufig bereits unter Windows vorhanden sind. Ebenso kann „uniq_tmp.txt“ ein beliebiger Name sein, solange er einheitlich verwendet wird.
Nach dem Speichernuniq_npp.bat, sind wir nun bereit, die Funktionalität in Notepad++ zu integrieren. Öffnen Sie dazu das Notepad++Laufen...Menü ( F5) und geben Sie in das angezeigte Feld etwa Folgendes ein:
cmd /k C:\path\to\uniq_npp.bat "$(FULL_CURRENT_PATH)"
Sie können Ihren Notepad++-Befehl vor dem Speichern testen, indem Sie auf die Schaltfläche „Ausführen“ ganz links klicken.
Beispiel: Ausführen...-Dialog
Andernfalls klicken Sie auf "Speichern..." und benennen Sie Ihren Befehl entsprechend. Sie können ihm eine Tastenkombination zuweisen, wenn Sie möchten, aber das ist nicht erforderlich. Klicken Sie auf "OK", um Ihre Befehlseinstellungen beizubehalten und sie in dasLaufen...Dropdown-Menü zur späteren Verwendung.
Beispiel: Dropdown-Menü ausführen
uniq
Falls es Ihr Interesse weckt, habe ich im Abschnitt „Anmerkungen“ am Ende dieser Antwort einen sehr kurzen Überblick über die Einzelheiten der Funktionsweise der Lösung gegeben.
Vorbehalte
Eine wichtige Sache, die man bei dieser Lösung bedenken sollte, uniq
ist, dass sieerfordert unbedingtein Pfad zu einer auf der Festplatte gespeicherten Datei (das Dokument kann nicht nur in Notepad++ geöffnet werden).
Dies ist kein Problem bei einer bestehenden Datei, die Sie geöffnet haben. Wenn Sie jedoch eine neue Datei erstellen oder eine bestehende Originaldatei ändern, müssen SieSpeichernes zuerst, bevor Sie Ihreuniq_npp.batDatei. Andernfalls schlägt der Vorgang fehl und alle neuen Daten werden nicht sortiert.
Als kleiner Vorteil ist es wahrscheinlich erwähnenswert, dass diese Speicherbeschränkung nicht für die oben genannte Option für reguläre Ausdrücke gilt.
Anmerkungen
Sortierung
Die angebotenen Lösungen (also der anfängliche reguläre Ausdruck und uniq
) erfordern beide, dass doppelte Zeilen direkt übereinander erscheinen, damit sie entfernt werden können, z. B.:
duplicate line X
duplicate line X
Das bedeutet, dass es wichtig ist, Ihre Daten zu sortieren, bevor Sie eine dieser Operationen anwenden. Ich gehe davon aus, dass Sie dies aufgrund Ihrer Beispieldaten bereits tun, aber es ist trotzdem erwähnenswert.
Notepad++-Makros
Als kleiner Vorschlag: Da Notepad++ keine eigentlichen Tastaturkürzel für die integrierten Zeilensortiervorgänge hat, möchten Sie vielleicht ein Makro aufzeichnen, das Ihnen beim Sortieren hilft. Insbesondere können Sie einBearbeiten → Alles auswählen( Ctrl+ A) und wählen Sie dann eine derBearbeiten → Zeilenoperationen → Zeilen lexikografisch sortierenOptionen.
Für die uniq
Lösung kann es auch sinnvoll sein, als letzten Schritt eines Sortiermakros einen „Speichern“-Vorgang aufzuzeichnen. Beachten Sie auch, dass die Schritte für die Option „Regulärer Ausdruck“ (Öffnen des Ersetzen-Dialogs, Eingeben des regulären Ausdrucks usw.) ebenfalls in einem praktischen Makro aufgezeichnet werden können.
So funktioniert die uniq-Lösung
In Kürze:
Die Zeile „Ausführen...“ öffnet ein Befehlsfenster (
cmd /k
), ruftuniq_npp.batund gibt den Pfad zum Speicherort der aktuell ausgewählten Datei an.Inuniq_npp.bat
%*
wird dieser Pfad über das an übergebene Platzhalterzeichen erfasstuniq
. Die deduplizierten Daten von werden dann ( ) nach „uniq_tmp.txt“uniq
umgeleitet .>
Abschließend öffnet die Batchdatei diesen bereinigten Text in einem neuen Notepad++-Tab und das Eingabeaufforderungsfenster wird über geschlossen
exit()
.
uniq_npp.bat Verbesserungen (?)
Was das Sortieren betrifft, besteht eine weitere Möglichkeit darin, die Verwendung von Notepad++ zum Sortieren ganz zu überspringen. Sie verlieren möglicherweise etwas Flexibilität im Prozess hinsichtlich der Sortieroptionen, aber Sie können Elemente einfach als zusätzlichen Schritt in Ihrer Batchdatei über dasWindows-SortierungBefehl. Um diesen Schritt hinzuzufügen, können Sie die erste Zeile vonuniq_npp.batwie folgt:
sort %* | C:\path\to\uniq.exe > C:\temp\uniq_tmp.txt
Dadurch werden die sortierten Daten einfach von sort
nach weitergeleitet uniq
. Wie Sie sehen, sort
wird jetzt zunächst der Datenpfad erfasst, anstatt uniq
.
Ein weiterer Gedanke ist, (möglicherweise) das %*
Platzhalterzeichen als Teil einer Zeichenfolgenoperation zu verwenden, um den ursprünglichen Dateinamen zu erhalten und beispielsweise „uniq_tmp.txt“ durch etwas wie „original-filename_uniq.txt“ zu ersetzen, um es eindeutiger zu machen.
Möglichen Gefahren
Standardmäßig
sort
sortiert Windows Zahlen wie folgt:1 11 2 21
wenn ihnen nicht eine 0 vorangestellt ist (z. B. 01, 02, 011, 021
).
- Das GnuWin32 CoreUtils Paket enthält zwar einen Port desUnix-SortierungDienstprogramm (das über robustere Optionen als Windows verfügt
sort
), diese spezielle Implementierung (im Gegensatz zu den meisten GnuWin32-Dienstprogrammen) erscheint mir unter Windows etwas dürftig. Wenn Sie jedoch einen anderen Windows-Port der Unix-Version von verwendensort
, besteht dieses Problem möglicherweise nicht und könnte sich insgesamt als bessere Option erweisen.
Antwort2
Ich habe festgestellt, dass dies bei Elementen, die nicht in der richtigen Reihenfolge sind, gut funktioniert:
Suchen:
(?s)^(.*?)$\s+?^(?=.*^\1$)
Klicken Sie auf „Alles ersetzen“, wenn das Feld „Ersetzen durch:“ nichts enthält.
Bearbeiten:
Hier ist die Schritt-für-Schritt-Anleitung:
(?s) Punkt entspricht auch einer neuen Zeile.
^ Zeilenanfang
(.*?)$ Erstellen Sie die erste Erfassungsgruppe, indem Sie null oder mehr beliebige Zeichen ohne Suchlauf abgleichen, bis das erste Zeilenende erreicht ist.
\s+? Findet ein oder mehrere Leerzeichen, ohne Gier
^ Zeilenanfang (nochmals)
(?= Positiver Vorausblick mit einer nicht erfassenden Gruppe (dieses Muster muss übereinstimmen, wird aber nicht gespeichert).
.*^\1$) Findet gierig null oder mehr Übereinstimmungen mit Zeichen und fährt fort, bis eine neue Zeile kommt, in der die gesamte Zeile mit der ersten Erfassungsgruppe übereinstimmt.
Der reguläre Ausdruck erstellt also eine Erfassungsgruppe und durchsucht dann alle Zeilen im Dokument, bis er eine findet, die genau mit dieser Zeile übereinstimmt, und ersetzt die Originalzeile durch nichts.
Nachtrag: Ich habe damals nicht daran gedacht und entschuldige mich beim Ersteller des Regex, aber ich glaubeScottist insofern richtig, als dass ich eine leicht modifizierte Version eines regulären Ausdrucks verwendet habe, den jemand anderes erstellt hatte. Wenn ich den Ursprung erraten müsste, würde ich sagen, dass es sich wahrscheinlich eher um die Antwort handelt, die tatsächlich in dem von ihm angegebenen Link angegeben ist, der zu finden istHier.
Abschließend möchte ich mich bitte für Folgendes entschuldigen:
- Ich gebe nicht die Anerkennung, die angebracht ist. Ich habe damals nicht daran gedacht, aber ich hätte es tun sollen.
- Ich erkläre die von mir gegebene Antwort nicht vollständig. Dies würde das Verständnis der Person für das Geschehen verbessern, sodass sie die Informationen möglicherweise für andere Probleme verwenden kann.
- Ich antworte nicht schneller auf Scotts Kommentar. Ich bin kein großer Experte in der Nutzung dieser Site (deshalb meine niedrige Bewertung) und habe erst heute daran gedacht, meine Benachrichtigungen zu überprüfen.
Mein Dank!
Antwort3
Danke, aber Regex und Uniq haben nur doppelte Zeilen nebeneinander erkannt. Wenn Sie stattdessen dieses Awk-Skript als awkuniq-npp.bat verwenden, ist es Notepad++-kompatibel. 4-zeilige Bat-Datei:
C:\Pfadzu\awk.exe '(a[$0]++==0)' %* > %*.1 del %* Verschiebe %*.1 %* Ausfahrt()Auszuführender Befehl:
cmd /k C:\Pfadzu\awkuniq-npp.bat "$(VOLLSTÄNDIGER_AKTUELLER_PFAD)"
Es verwendet Auto-Reload nach Del/Move, um den gleichen Dateinamen zu ersetzen
Antwort4
Ich verwende den folgenden Such-/Ersetzungs-Regex (nachdem ich die Zeilen sortiert habe), da er für mich intuitiver zu verstehen ist:
Find: (.*)\r?\n(\1\r?\n)+
Replace with: \1\r\n
Erklärung:
- Suchen Sie nach „irgendwas“ (einer Textzeile), gefolgt von einer neuen Zeile (\n oder \r\n): .\r?\n
– den Inhalt der Zeile in einer Variablen behalten: (.)\r?\n
– sucht nach Wiederholungen derselben Zeile ein- oder mehrmals: (.*)\r?\n(\1\r?\n)+
Ersetzung: - Ersetzen Sie alles Obige nur durch die Zeile selbst und eine neue Zeile: \1\r\n
Hoffe, es hilft,
sb3k