2017-02-21 28 views
4

Ich habe Text auf neue Zeilen wie folgt:Wie lösche ich jede dritte Zeile in Notepad ++?

tom 
tim 
john 
will 
tod 
hello 
test 
ttt 
three 

ich jede dritte Zeile so am Beispiel löschen wollen oben I entfernen möchten: john,hello,three

Ich weiß, dass dies für einige regex nennt, aber ich bin nicht der Beste dabei!

Was ich versucht:

Search: ([^\n]*\n?){3} //3 in my head to remove every third 
Replace: $1 

Die anderen habe ich versucht, waren Versuche nur mit \n\r usw. Auch hier ist nicht die beste mit regex. Der obige Versuch, dachte ich, war irgendwie nah.

+2

Teilen Sie Ihre Forschung hilft jedem. Sagen Sie uns, was Sie ausprobiert haben und warum es nicht Ihren Bedürfnissen entspricht. Dies zeigt, dass Sie sich die Zeit genommen haben, sich selbst zu helfen, es rettet uns davor, offensichtliche Antworten zu wiederholen, und vor allem hilft es Ihnen, eine spezifischere und relevantere Antwort zu bekommen! Siehe auch: [ask] –

+1

Arbeitete für mich. Ich benutze gedit auf ubuntu. Ich suchte mit '(. *?) \ N (. *?) \ N (. *) \ N' und ersetzte es mit' \ 1 \ n \ 2 \ n' –

Antwort

6

gedit ubuntu

Suchen nach: (.*?)\n(.*?)\n(.*)\n
Ersetzen durch: \1\n\2\n

3
  • Ctrl +H
  • Suchen nach: ((?:[^\r\n]+\R){2})[^\r\n]+\R
  • Ersetzen durch: $1
  • Alle ersetzen

Erläuterung:

(    : Start group 1 
    (?:   : start non capture group 
    [^\r\n]+ : 1 or more NON linebreak 
    \R   : linebreak (\n or \r or \r\n) 
){2}   : repeated twice 
)    : end group 1, it contains 2 lines 
[^\r\n]+  : 1 or more NON linebreak 
\R    : linebreak (\n or \r or \r\n) 

Ergebnis für gegebene Beispiel:

tom 
tim 
will 
tod 
test 
ttt 
+0

Liebe die Erklärung! Vielen Dank. +1 – irishwill200

1

Da die OP sagt Sahil Antwort "wie ein Charme" I Ich nehme an, dass der Text in Notepad ++ mit einem Zeilenumbruch endet er. Sonst werden Sahils und Totos Antworten nicht mit den letzten Worten übereinstimmen.

Sahil Muster: (.*?)\n(.*?)\n(.*)\n nimmt 79 Schritte *, wenn der Text in \n endet; sonst 112 Schritte und schlägt fehl.
Sein Ersatz Ausdruck verwendet unnötigerweise zwei Capture Group Referenzen.

Totos Muster: ((?:[^\r\n]+\R){2})[^\r\n]+\R dauert 39 Schritte * wenn der Text in \n endet; sonst 173 Schritte und schlägt fehl. Sein Ersatzausdruck verwendet eine Fanggruppenreferenz.

Mein vorgeschlagenes Muster dauert nur 25 Schritte und verwendet keine Erfassungsgruppen. Ihr Text ist eine Reihe von nicht-weiß mit weißen Zeichen gefolgt Zeichen und so ist die folgende die kürzeste und präziseste Muster, die maximale Geschwindigkeit bestimmt: sollte

\S+\s+\S+\s+\K\S+\s* 

Dieses Muster mit einem leeren gepaart werden Ersatz.

\S bedeutet "non-white-space character"
\s "white-space character" bedeutet
+ bedeutet ein oder mehreren der vorhergehenden Spiel
* bedeutet Null oder mehreren der vorhergehenden Spiel
\K Mittel Keep the match ab hier

Die * auf die endgültige \s ermöglicht die abschließenden 3 Zeilen Text ohne ein abschließendes Newline-Zeichen abzuschließen. Wenn Sie diese Art von Operation für einen großen Textblock ausführen, müssen Sie sicherstellen, dass die Ersetzung für den gesamten Text ordnungsgemäß funktioniert und keine unerwünschten Teilstrings vorhanden sind.

Obwohl ich sicher bin, dass Sie diese Regex-Aufgabe schon lange vergessen haben, ist es wichtig, dass zukünftige Leser davon profitieren, den besten Weg zu lernen, um das gewünschte Ergebnis zu erzielen.

+0

Danke für Ihre Eingabe! – irishwill200

Verwandte Themen