2016-08-16 4 views
1

ich eine Datei mit viel Text haben, aber auf einigen Reihen gibt es Linien mit nur:Regex halten alle Linien mit Trennzeichen (sublime)

sometext:someothertext

Was ich will, ist, diese Zeilen zu halten. Ich habe einen regulären Ausdruck geschrieben, aber das tut genau das Gegenteil von dem, was ich will:

[0-9a-zA-Z]+(:[0-9a-zA-Z]+)

Auch gibt es ein paar Zeilen mit den Begrenzer in ihm. Ich muss diese nicht behalten. Eine Probe Linie wäre:

Dies ist eine sehr schöne Linie sagen Sachen über sometext: someothertext

Wie würden die Regex nur die Linien sometext:someothertext Format enthält, bekommen aussehen?

Antwort

3

können Sie

^(?![0-9a-zA-Z]+:[0-9a-zA-Z]+$).*$\R* 

verwenden Dieser Ausdruck wird like this arbeiten.

Ersatztext ist leer.

Muster Details:

  • ^ - Zeilenanfang (die m mehrzeilige Option ist standardmäßig in Sublime Text)
  • (?![0-9a-zA-Z]+:[0-9a-zA-Z]+$) - die Linie nicht dem Muster entsprechen sollte: 1+ alphanumerics mit einem : gefolgt und wieder 1 oder mehr alphanumerische Zeichen
  • .*$ - entspricht der gesamten (auch leeren) Zeile
  • \R* - und null oder mehr Zeilenumbrüche.

Wenn ich den folgenden Text:

local06:local16 
TEXT local76:local16 
local06:local17 
local06:local19 

More TEXT local76:local678 

Das Ergebnis ist:

enter image description here

+1

Vielen Dank! Arbeiten wie es sein sollte! Ich wusste nicht über "Nicht passend" – Baklap4

+1

Das '(?! ...)' Konstrukt heißt ein [** negatives Lookahead **] (http://www.regular-expressions.info/lookaround.html) . Das '$' darin teilt der Regex-Engine mit, die * ganze Zeile * zu überprüfen, andernfalls würde die Übereinstimmung nur dann fehlschlagen, wenn eine Zeile mit Ihrem Muster beginnt. –

0

Hier ist ein negatives Beispiel:

[^: \t]:[^: \t] 

Spiel:

  1. nicht Dickdarm-, Leerzeichen oder Tab
  2. Kolon
  3. nicht Dickdarm-, Leerzeichen oder Tab

Sie auf die „nicht“ Zeichenklasse hinzufügen können (es) alles, was Sie möchten ausschließen .Hier

ist ein positives Beispiel:

[0-9A-Za-z]:[0-9A-Za-z] 

Verwendung mit grep, awk oder sed und die oben wird die Linie für den Druck entsprechen:

grep '[^: \t]:[^: \t]' foo.txt 
awk '/[^: \t]:[^: \t]/' foo.txt 
sed '/[^: \t]:[^: \t]/ p; d' foo.txt 

grep '[0-9A-Za-z]:[0-9A-Za-z]' foo.txt 
awk '/[0-9A-Za-z]:[0-9A-Za-z]/' foo.txt 
sed '/[0-9A-Za-z]:[0-9A-Za-z]/ p; d' foo.txt 

Wenn Sie die ganze übereinstimmen soll Linie ... Sie können .* vor und nach beiden Regex verwenden.

Verwandte Themen