2016-12-20 5 views
0

Ich versuche, eine Gruppe von Linien herauszufiltern, die einem Muster mit einer Regexp entsprechen, habe aber Probleme, die richtige Regexp zu verwenden.So passen Sie eine Gruppe von Linien an, die einem Muster entsprechen

Die Textdatei enthält Zeilen wie diese:

transaction 390134; promote; 2016/12/20 01:17:07 ; user: build 
    to: DEVELOPMENT ; from: DEVELOPMENT_BUILD 
    # some commit comment 
    /./som/file/path 11745/409 (22269/257) 

    # merged 
    version 22269/257 (22269/257) 
    ancestor: (22133/182) 

transaction 390136; promote; 2016/12/20 01:17:08 ; user: najmi 
    to: DEVELOPMENT ; from: DEVELOPMENT_BUILD 
    /./some/other/file/path 11745/1 (22269/1) 

    version 22269/1 (22269/1) 
    ancestor: (none - initial version) 
    type: dir 

Ich möchte die Linien, um herauszufiltern, die mit „Transaktion“, enthalten starten „Benutzer: bauen den ganzen Weg bis zur nächsten Zeile, die mit“ Transaktion“.

Die Idee ist, mit Transaktionszeilen zu landen, wo Benutzer nicht‚Build‘.

Vielen Dank für jede Hilfe.

+0

Möchten Sie das? https://regex101.com/r/DOeWXt/1 –

+0

@ Herr Kang Vielen Dank für die coole Regex101.com Website. Die Regexp wie gezeigt entspricht nicht dem gesamten Transaktionsdatensatz, der mehrere Zeilen umfasst, also ist dies nicht genau das, wonach ich gesucht habe. Ich wäre dankbar für eine reine Regexp-Lösung, die der von pii_ke freundlicherweise angegebenen Perl-Lösung entspricht. –

+0

@ Mr.kang Ich habe folgende Regexp in der Verknüpfung arbeiten, die Sie gaben: ^ Transaktion. +? Benutzer: \ s (?! Build) (. | \ N) + Allerdings habe ich Probleme bekommen, dass mit folgendem Befehl grep zu arbeiten: grep "^ Transaktion. +? Benutzer: \ s (?! Build) (. | \ n) +" test_data.txt –

Antwort

2

Wenn Sie möchten, o NLY die Transaktionslinien für alle Benutzer mit Ausnahme build:

grep '^transaction ' test_data| grep -v 'user: build$' 

Wenn Sie die gesamte Transaktion Rekord für solche Benutzer:

awk '/^transaction /{ p = !/user: build$/};p' test_data 

ODER

perl -lne 'if(/^transaction /){$p = !/user: build$/}; print if $p' test_data 

Die -A und -v Optionen von grep Befehl hätte den Trick gemacht, wenn alle Transaktionsdatensätze die gleiche Anzahl von Zeilen hätten.

+0

Das hat perfekt funktioniert! Vielen Dank. Wenn jemand eine pure grep Lösung hat, bitte share as perl ist momentan nicht für uns installiert. –

+0

@FarrukhNajmi Ich habe einen anderen Befehl hinzugefügt, der das gleiche tut, könnte sich als nützlich erweisen, wenn Sie 'awk' installiert haben. –

Verwandte Themen