Zeilenübergreifend greppen

Hi Leute,

Ich möchte eine Datei gerne nach einem Ausdruck durchsuchen, der über mehrere Zeilen geht, leider spuckt egrep bei Konstrukten wie "BLABLA$\"POS\"" immer nichts aus, er aber soll quasi die gesamte Datei nach drei Zeilen durchsuchen und nicht eine Zeile, in der ein Zeilenende vorkommt. Kennt einer einen Trick? Geht das überhaupt?
 
normalerweise gibt es dafür den modifier s welcher das dann alles wie eine einzelne lange zeile betrachtet
 
hab mich da vertan, hab mich jetzt auch etwas umgeschaut aber wie ich sehe unterstützt grep wohl keine perl artigen regulären ausdrücke
 
Hi blueflash.

Das was Du vorhast, kann mit grep oder egrep nicht funktionieren. Diese Programme arbeiten ein Zeile ab, testen ob bestimmte Bedingungen erfüllt sind, reagieren darauf und widmen sich danach der nächsten Zeile. Die Zeile zuvor ist also für grep nicht mehr verfügbar, weshalb Bedingungen aus den Zeilen danach nicht mehr auf die vorherigen Zeilen anwendbar sind. Du könntest allerdings ein anderes Zeilenende-Zeichen angeben und damit z.B. nach drei bestimmten Sätzen in einem Absatz suchen (indem Du grep beibringst, dass jeder Absatz eine Zeile ist und Du so in jeder ?Zeile? nach dem dreimaligen BLABLA suchst). Aber das ist denke ich nicht dass, was Du möchtest.

Alternative: Auf jedem UNIX-System sollte sich auch ein awk befinden, welcher hierfür wohl die richtige Wahl wäre:

awk 'BEGIN {iL=0}
{
if ($0 ~ /BLABLA$/) {
Line[iL]=$0
iL=iL+1
} else { iL=0 }
if (iL == 3) {
for (i=0; i<=2; i++) { print Line }
iL=0
}
}' test.txt

Das Script sucht nach Zeilen in test.txt, die mit ?BLABLA? enden und gibt alle Zeilen aus, auf denen die Bedingung dreimal hintereinander zutrifft.

Hinweis: Statt ?if ($0 ~/BLABLA$/ )? wäre wohl ?if ($NF == ?BLABLA?)? eleganter, denn $NF ist das letzte Feld der Zeile, wobei $(NF-1) dem vorletzten Feld der Zeile entspricht, etc.

Bye, nz
 
Unter perl, wenn du die ganze datei in eienr variablen hast gehts mit dem "g" (global) modifizierer

s/bla/fasel/gi

mfg
 
OK, da wir mittlerweile wissen, dass grep es nicht kann und ich ohne die Regex (die ca. 300 zeichen stark ist) vorher zu testen sie nicht in den C-code hämmern werde, gibts jetzt die Holzhammer Methode, ich hole einfach vorher alle CRLFs raus. Fertig.

thx für die hilfe.
 
Ah, ich verstehe. Es kommt Dir nicht darauf an, dass grep Dir diese drei Zeilen ausgibt. Du möchtest nur feststellen, ob dort die drei Zeilen enthalten sind, richtig? Das sollte sich auch mit grep realisieren lassen. Siehe mal in die man, da sollte es einen Parameter geben, mit dem Du das Zeilenende-Zeichen von grep bestimmst. Hier gibst Du einfach etwas anderes an, was in der Datei nicht vorkommt, und Du hast denselben Effekt, als wenn Du alle CRLFs zuvor gelöscht hättest.

Bye, nz

Nachtrag: Der Vorteil dieser Methode ist, dass Du noch immer nach Vorkommen im tatsächlichen Zeilenende suchen kannst ? nur jetzt eben auch darüber hinaus (/BLABLA\n\r.*BLABLA\n\r/).
 
Zurück
Oben