2012-12-03 7 views
5

Ich arbeite gelegentlich mit Textdateien, in denen einige Abschnitte mehrere Absätze mit der gleichen Struktur haben. Hier ist ein Beispiel:Einfache Möglichkeit, mehrzeiligen semi-strukturierten Inhalt zu analysieren und abzufragen

Some unrelated preface I'm not interested in... Lorem ipsum dolor sit amet, 
consectetur adipiscing elit. Etiam scelerisque. 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Etiam scelerisque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam scelerisque. 

001 [SomeTitle 1] - Some Subtitle 1 
    Name: SomeName 
    Area: SomeArea 
    Content: Some multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. Etiam scelerisque. Lorem ipsum dolor sit amet, 
      consectetur adipiscing elit. Etiam scelerisque. 

002 [SomeTitle 2] - Some Subtitle 2 
    Name: SomeOtherName 
    Area: SomeOtherArea 
    Content: Some other multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. 

Ich bin für eine einfache Möglichkeit suchen Dateien wie diese abzufragen. Wenn ich zum Beispiel nach "Area: SomeOtherArea" frage, sollte das Ergebnis alle Blöcke der Datei mit diesem Bereich sein. Ich meine alle vier Absätze: Header, Name, Bereich, Inhalt. Ich könnte grep mit den Optionen -A und -B verwenden, aber das Problem besteht darin, dass die Inhaltsabsätze aus einer beliebigen Anzahl von Zeilen bestehen können. Und das ist nur dieses spezielle Beispiel; Die Struktur könnte komplett anders sein.

Ich bin auf der Suche nach einer leichten, leicht anpassbaren Lösung, vielleicht einer Kombination von CLI-Tools. Ich will das Rad nicht neu erfinden.

+0

Bewegen Sie die Maus über alle Tags, die Sie Ihrer Frage zugewiesen haben. Manche haben keine Follower. Besser, deine Tags so zu ändern, dass sie mindestens das Ziel-Betriebssystem enthalten (Unix/vs/Linux/vs/Windows/vs/Cygwin/...?) Und Werkzeuge, mit denen du dich auskennst, eine Shell? bash/ksh, und fügen Sie Ihre Suchwerkzeuge grep, ?? Andere. Viel Glück. – shellter

Antwort

2

Es tut mir leid, aber es gibt nur so weit, dass Sie mit einem solchen Problem umgehen können, denn Sie scheinen ein Schweizer Taschenmesser mit unendlich erweiterbaren Funktionen zu haben, aber ohne Programmieraufwand: -)! Solch eine Sache ist mäßig möglich, aber angesichts Ihrer weit offenen Spezifikation, erinnern Sie sich daran, dass Menschen Jahre damit verbringen, Suchmaschinen wie Lucene, Google und tausend andere aufzubauen, um diese Art von Problem zu lösen.

Das heißt, wenn Sie mit einem Suchtool zufrieden sein können, das eine sehr einfache Regel hat, die beachtet werden muss UND Sie ein Unix/Linux/Cygwin-System verwenden oder haben, kann Folgendes funktionieren.

Grundregel: Datenblöcke werden auf der Grundlage eines Leerzeichens gesucht, das die einzelnen Blöcke trennt (wie in den obigen Beispieldaten).

cat paraSearch.ksh 

#!/bin/ksh 
# (or #!/bin/bash or likely others) 

case $# in 0) echo "usage:paraSearch.ksh SearchTargetPattern file2search [file2 ....]" ; exit 1 ;;esac 

# read the first pattern as the search target, 
# use quotes on cmd-line if you want to use 
# regexp chars like '*' 
mySrchPat="$1" ; shift 

#dbg set -vx 
awk -v mySrchPattern="$mySrchPat" \ 
    'BEGIN{RS=""; ORS="\n\n"} 
    #dbg {print "$0="$0; print "----------------------------------------------" } 
    $0 ~ mySrchPattern{ print $0} 
' "${@}" 

chmod 755 paraSearch.ksh 

Test Ihre Beispieltext und searchTarget und der Ausgang

$ ./paraSearch.ksh SomeName multiLineTest.txt 
001 [SomeTitle 1] - Some Subtitle 1 
    Name: SomeName 
    Area: SomeArea 
    Content: Some multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. Etiam scelerisque. Lorem ipsum dolor sit amet, 
      consectetur adipiscing elit. Etiam scelerisque. 

Um mehr über awk erfahren wollen, lesen durch (mehrmals), um diese hervorragende Anleitung mit: The Grymoire's Awk Tutorial.

IHTH