2016-07-15 10 views
2

Ich habe lange Liste von Zeilen mit vielen Situationen Linie, Zeilen, die identische erste Wort (erste Zeichenfolge vor Leerzeichen) haben, aber der Rest ist anders. Ich muss nur eine Zeile mit eindeutigen ersten String beibehalten.Regex zum Löschen von Zeilen, die mit der ersten Zeichenfolge übereinstimmen?

john jane 
john 123 
john jim jane 
jane john 
jane 123 
jane 456 
jim 
jim 1 

dieses Ergebnis haben:

john jane 
jane john 
jim 

Also, wenn erste Wort in Zeile das Spiel ist, alle Linie aber löschen.

Ich kann alle doppelten Linien, lösche, aber mit Zeilen wie in obigem Beispiel

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

Diese Regex löscht identische Zeilen, nicht wie im Beispiel lassen. Wenn es Regex oder Notepad Makro gibt, um das zu lösen?

+0

Nicht die besten Lösung für Notepad ++: '^ ((\ w + \ b). *) \ r? \ n \ 2. *' -> '$ 1' und drücken Sie * Alle ersetzen * mehrmals. –

+0

Sind die Zeilen mit dem gleichen "Wort" immer hintereinander? Und bitte beantworten Sie die Anubhava-Frage, wenn Sie relevante Antworten wünschen. –

Antwort

2

Mit Notepad ++ (Linien mit dem gleichen ersten Wort der Annahme sind konsekutiv):

Suche: ^(\S++).*\K(?:\R\1(?:\h.*|$))+
Ersatz: nichts

demo

Musterdetails:

^    # start of the line 
(\S++)  # the first "word" (all that isn't a whitespace) captured in group 1 
.*   # all characters until the end of the line 
\K   # remove characters matched before from the match result 
(?: 
    \R  # a newline 
    \1  # reference to the capture group 1 (same first word) 
    (?: 
     \h.* # a horizontal whitespace 
     |  # OR 
     $  # the end of the line 
    ) 
)+   # repeat one or more times 
+0

Bestätigt, es funktioniert für meine Datei. Funktioniert auch in Ultraedit, benutze es, weil Notepad ++ sehr große Dateien nicht verarbeiten kann. – Jim8645

+1

@ Jim8645: Beachten Sie, dass bei Verwendung von Unix/Linux der spsic awk-Ansatz für große Dateien interessant ist, da nicht alle Dateien im Speicher geladen werden müssen. –

0

In Perl:

s/^((\w+).*)\n(?:(?:\2.*\n)*)/$1/gm 

Sie können es mit diesem einen Versuch geben:

#!/bin/usr/perl 

use warnings; 
use strict; 

my $file = "john jane 
john 123 
john jim jane 
jane john 
jane 123 
jane 456 
jim 
jim 1 
"; 

$file =~ s/^((\w+).*)\n(?:(?:\2.*\n)*)/$1\n/gm; 

print $file;