Wie 'grep -A' umsetzen ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
McRib
User
Beiträge: 9
Registriert: Sonntag 1. Juli 2007, 17:31

Donnerstag 19. Juli 2007, 10:43

grep -A [num] gibt die naechsten [num] Zeilen nach dem match aus.

Code: Alles auswählen

output = os.popen(command).read()
p = re.compile(pattern)
r=p.search(output)
r.group() gibt mir nur das match, wie komme ich an die naechsten [num] Zeilen ???
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 19. Juli 2007, 10:48

Schau dir mal die Funktion "re.split" an. Damit kannst du die Eingabe teilen und musst nur noch die "rechte" Seite des Ergebnisses in Zeilen aufteilen.
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Donnerstag 19. Juli 2007, 11:02

Code: Alles auswählen

output = 'foo\nbar\nbaz\nqux'
o = output.split()
for row in o:
    if row == "bar": # oder Regulären Ausdruck matchen
        print o[o.index(row):2]
https://www.xing.com/go/invite/18513630.6a91d4
BlackJack

Donnerstag 19. Juli 2007, 11:23

Funktioniert so nicht, falls 'bar' mehrfach vorkommt. Und statt in einer ``for``-Schleife nach 'bar' zu suchen um dann im Erfolgsfall mit `index()` auch nach 'bar' zu suchen, also genau das zu machen, was die ``for``-Schleife eben schon einmal getan hat…
BlackJack

Donnerstag 19. Juli 2007, 11:30

So könnte man das machen:

Code: Alles auswählen

from __future__ import with_statement
import re

def grep_a(regex, lines, count=1):
    lines_left = 0
    for line in lines:
        if regex.search(line):
            lines_left = count
        if lines_left:
            yield line
            lines_left -= 1

def main():
    with open('test.py', 'r') as lines:
        for line in grep_a(re.compile('^def '), lines, 3):
            print line,
McRib
User
Beiträge: 9
Registriert: Sonntag 1. Juli 2007, 17:31

Donnerstag 19. Juli 2007, 12:07

viele antworten in so kurzer Zeit :-D Scheint wohl der Donnerstagmittag-Brainteaser zu sein...

Mal angenommen ich wuerde statt der Schleifen das Pattern um die nachsten 4 Zeilen erweitern, wuerde das funktionieren ?

Irgendwie funktioniert der Einsatz von ^ und $ nicht gemaess meinen Erwartungen :-(

Edit: habs jetzt - Danke fuer die Tips...
Antworten