[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: "grep -A 10 -v" welches grep bearbeitet -A n vor -v? Gibt es irgendwo ein hack oder patch?



Robert Michel <news@robertmichel.de> wrote:

> Natürlich geht es nicht mit dem orginalen grep - das ärgert mich ja,
> schaut man sich aber "echo -e 'a\nb\nb\nc\nd' |grep -A 1 b"
> an, so kann grep sehrwohl sich "Zusätzliche Zeilen merken"
>
>
> echo Zeile1; Muster?  nein -> $ZusätzlicheZeilen > 0 ?  Nein >  echo ""
> echo Zeile2; Muster?  ja -> ZusätzlicheZeilen=1;  echo "Zeile2"
> echo Zeile3; Muster?  ja -> ZusätzlicheZeilen=1;  echo "Zeile3"
> echo Zeile4; Muster?  nein -> $ZusätzlicheZeilen >9 ? Ja > 
>      ZusätzlicheZeilen=$ZusätzlicheZeilen-1; echo "Zeile4"
> echo Zeile5; Muster?  nein -> $ZusätzlicheZeilen > 0 ?  Nein >  echo ""
>
> Nur der allerletzte Schritt mus invertiert werden.  

Ich glaube, du hast da einige Missverständnisse bezüglich dessen was
grep macht.  Erstens hat es natürlich nichts mit "echo" zu tun; aber ich
denke das weißt du auch und hast es nur als Symbol für "analysiere"
(erstes Auftreten) bzw. "gebe aus" (zweites Auftreten) verwendet.

Zweitens der Begriff des "invertierens" - ich habe den in diesem
Zusammenhang noch nie gehört.  Falls du damit die Wirkung der Option -v
meinst:  Das bewirkt *nicht*, dass erst im Ausgabeteil eine Entscheidung
andersherum getroffen wird, als "nicht ausgeben" statt "ausgeben".
Vielmehr bewirkt es, dass die Bedeutung des Musters verneint wird.  In
deinem zweischrittigen Algorithmus oben wirkt es also nur im Abschnitt
"Muster?".  Erst wenn das erledigt ist, wird entschieden, ob nur die
gewählte Zeile ausgegeben wird oder noch welche danach oder davor.

> grep -A 10 -B 10 kann das sogar nach vorn und zurück.....

Und drittens, aber das hängt damit zusammen, arbeitet grep eben keine
Programme ab und merkt sich daher auch nichts über "alte" Zeilen.  Es
arbeitet stur zeilenweise, überprüft, welche Zeilen auf das Muster
zutreffen, und schaut dann nach, ob es diese ausgeben soll, oder die
anderen, oder noch welche in der Nachbarschaft.

Du hast aber eine Anforderung beschrieben, die nicht machbar ist, ohne
Informationen über vorhergehende Zeilen zu speichern.  Und das macht
grep nicht.

> Also es würde gehen - nur mit dem dummen grep nicht.

Natürlich geht es, und es gibt auch tools die das können.  Aber grep ist
kein solches tool, weil es nur Muster kann, aber keine Algorithmen.  Und
das liegt warscheinlich auch nicht daran, dass niemand bereit war, das
zu implementieren, sondern weil es in grep nichts zu tun hat.

Gruß, Frank
-- 
Frank Küster
Single Molecule Spectroscopy, Protein Folding @ Inst. f. Biochemie, Univ. Zürich
Debian Developer (teTeX)



Reply to: