Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile) (https://www.delphipraxis.net/170086-grep-nur-eigentliche-matches-ausgeben-nicht-die-ganze-zeile.html)

uligerhardt 30. Aug 2012 09:13

grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile)
 
Hallo!

Kennt ihr eine Möglichkeit, grep (oder einem anderen, möglichst kostenlosem Tool) beizubringen, das es nur die direkten Treffer ausgeben soll und nicht die ganzen enthaltenden Zeilen? Wenn ich bspw. (mit RegEx) nach
Delphi-Quellcode:
MyFunction\(\d+\)
suche, kriege ich ein Liste in folgender Art
Code:
Result := MyFunction(42);
if MyFunction(666) > 0 then
Result := MyFunction(11) + MyFunction(22);
Wünschen würde ich mir sowas:
Code:
MyFunction(42)
MyFunction(666)
MyFunction(11)
MyFunction(22)

himitsu 30. Aug 2012 09:44

AW: grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile)
 
Indem du das, was nicht enthalten sein soll, auch nicht in das Ergebnis aufnimmst?

> look-ahead assertion ...(?=...)
und
> look-behind assertion (?<=...)...

Code:
(?<=MyFunction\()\d+(?=\))

(?<=MyFunction\()[0-9]+(?=\))
[edit]
falsch verstanden...

Wieso sollte es denn die ganze Zeile liefern?

Wenn man nur nach "MyFunction\(\d+\)" sicht, dann bekomme man eigentlich auch nur "MyFunction(...)" raus.
Wenn nicht, dann machst du was falsch und da keiner verraten hat, wie er es macht, wissen wir auch nicht was er falsch macht. :angle2:

uligerhardt 30. Aug 2012 10:15

AW: grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile)
 
Zitat:

Zitat von himitsu (Beitrag 1180606)
Wieso sollte es denn die ganze Zeile liefern?

Das frage ich mich auch, aber sowohl der Grep-GExpert als auch das Borland-Kommandozeilen-grep tun es. :mrgreen:

Zitat:

Zitat von himitsu (Beitrag 1180606)
Wenn man nur nach "MyFunction\(\d+\)" sicht, dann bekomme man eigentlich auch nur "MyFunction(...)" raus.
Wenn nicht, dann machst du was falsch und da keiner verraten hat, wie er es macht, wissen wir auch nicht was er falsch macht. :angle2:

Ich behaupte mal, dass ich da nichts besonderes mache. Ich schmeiße mal das Besipiel MyFunction weg - in Wirklichkeit suche ich nach
Delphi-Quellcode:
Lpar^[...]
. Dabei ist Lpar eine Funktion, die einen Zeiger auf ein Array zurückliefert, und ich suche nach Aufrufen der Funktion + Array-Indizierung. (Bitte keine Kommentare zu dieser Konstruktion - ist ererbt.)

Wenn ich mit GExperts-Grep nach
Delphi-Quellcode:
Lpar\^\[.*\]
suche, kriege ich eine Liste von Zeilen, die das Muster enthalten. Ebenso, wenn ich in der Kommandozeile
Delphi-Quellcode:
grep -d+ -h+ -i+ "Lpar\^\[.*\]" *.pas
eintippe. Mache ich da schon was falsch? :?::shock:

himitsu 30. Aug 2012 10:25

AW: grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile)
 
Wobei die GExperts-Suche und auch die delphieigene Suche (inkl. RegEx) ja genau/absichtlich darauf ausgelegt sind dir die Zeilen zu zeigen, wo das Gesuchte enthalten ist. :zwinker:
Was das Programm "grep" machen soll, weiß ich nicht.

uligerhardt 30. Aug 2012 10:30

AW: grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile)
 
Zitat:

Zitat von himitsu (Beitrag 1180626)
Wobei die GExperts-Suche und auch die delphieigene Suche (inkl. RegEx) ja genau/absichtlich darauf ausgelegt sind dir die Zeilen zu zeigen, wo das Gesuchte enthalten ist. :zwinker:

Das mag schon sein, aber genau das kann ich eben gerade nicht brauchen. Darum frage ich ja.8-) Und wie ich eingangs schrieb, bin auch ja auch nicht auf diese Tools festgelegt.

Bummi 30. Aug 2012 10:48

AW: grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile)
 
als Schnellschuss, nicht optimiert

Project3 C:\temp\test.txt MyFunction(%)


Delphi-Quellcode:
program Project3;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
f:TextFile;
Buffer,SToken,EToken:String;

Procedure FindToken;
  var
   i,j:Integer;
  begin
     i := pos(SToken,Buffer);
     while i>0 do
      begin
        Buffer := Copy(Buffer,i+Length(SToken),Length(Buffer));
        j := Pos(EToken,Buffer);
        Writeln(SToken + Copy(Buffer,1,j));
        Buffer := Copy(Buffer,j+1,Length(Buffer));
        i := pos(SToken,Buffer);
      end;
  end;

begin
  try
    Stoken := Copy(Paramstr(2),1,Pos('%',Paramstr(2))-1);
    Etoken := Copy(Paramstr(2),Pos('%',Paramstr(2))+1,Length(Paramstr(2)));
    AssignFile(f,Paramstr(1));
    Reset(f);
    while not Eof(f) do
      begin
      ReadLn(f,Buffer);
      FindToken;
      end;
    Readln;
    CloseFile(f);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

uligerhardt 30. Aug 2012 12:05

AW: grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile)
 
Zitat:

Zitat von Bummi (Beitrag 1180639)
als Schnellschuss, nicht optimiert

Project3 C:\temp\test.txt MyFunction(%)

Danke, Bummi!

Ich bin mittlerweile auf eine quellcodefreie Lösung gekommen:
  1. Erst
    Delphi-Quellcode:
    grep -i+ -h+ -d+ "Lpar\^\[.*\]" *.pas > 1.txt
    ausführen. Dadurch habe ich eine Datei, die alle Treffer beinhaltet und muss mich nicht mehr um Wildcards in Dateinamen und Rekursion kümmern.
  2. Dann z.B. in Notepad++ alle
    Delphi-Quellcode:
    (lpar\^\[[^]]*\])
    in 1.txt durch
    Delphi-Quellcode:
    \r\n\1\r\n
    ersetzen. Das zerlegt mir jede Zeile, die einen Treffer enthält, in 3 (oder 5, 7, ...) Zeilen, wo in jeder zweiten Zeile nur ein Treffer steht. Die anderen Zeilen enthalten keinen Treffer.
  3. Schließlich noch 1.txt speichern und
    Delphi-Quellcode:
    grep -i+ -h+ "Lpar\^\[.*\]" 1.txt > 2.txt
    , um die überflüssigen Zeilen rauszuschmeißen.
Jetzt enthält 2.txt die gewünschte Liste. Nicht elegant, aber geht. :mrgreen:

shmia 30. Aug 2012 12:14

AW: grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile)
 
Das wäre vielleicht ein Job für den Stream Editor (SED) gewesen.
einige SED Beispiele: http://sed.sourceforge.net/sed1line_de.html

uligerhardt 30. Aug 2012 12:18

AW: grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile)
 
Zitat:

Zitat von shmia (Beitrag 1180659)
Das wäre vielleicht ein Job für den Stream Editor (SED) gewesen.
einige SED Beispiele: http://sed.sourceforge.net/sed1line_de.html

Boah, den hab ich ja ganz vergessen. :oops: An der Uni haben wir mit sed und awk coole Sachen gemacht...

implementation 30. Aug 2012 12:45

AW: grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile)
 
Warum so umständlich?
Im Manual findet sich folgender Parameter:
Zitat:

Zitat von man grep / info grep
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.

Damit wäre das Problem schon gelöst gewesen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz