AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein grep: nur eigentliche Matches ausgeben (nicht die ganze Zeile)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von uligerhardt · begonnen am 30. Aug 2012 · letzter Beitrag vom 30. Aug 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#1

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

  Alt 30. Aug 2012, 10:13
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 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)
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 30. Aug 2012, 10:44
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (30. Aug 2012 um 10:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#3

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

  Alt 30. Aug 2012, 11:15
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.

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.
Ich behaupte mal, dass ich da nichts besonderes mache. Ich schmeiße mal das Besipiel MyFunction weg - in Wirklichkeit suche ich nach 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 Lpar\^\[.*\] suche, kriege ich eine Liste von Zeilen, die das Muster enthalten. Ebenso, wenn ich in der Kommandozeile grep -d+ -h+ -i+ "Lpar\^\[.*\]" *.pas eintippe. Mache ich da schon was falsch?
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 30. Aug 2012, 11:25
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.
Was das Programm "grep" machen soll, weiß ich nicht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#5

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

  Alt 30. Aug 2012, 11:30
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.
Das mag schon sein, aber genau das kann ich eben gerade nicht brauchen. Darum frage ich ja. Und wie ich eingangs schrieb, bin auch ja auch nicht auf diese Tools festgelegt.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

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

  Alt 30. Aug 2012, 11:48
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.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (30. Aug 2012 um 11:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#7

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

  Alt 30. Aug 2012, 13:05
als Schnellschuss, nicht optimiert

Project3 C:\temp\test.txt MyFunction(%)
Danke, Bummi!

Ich bin mittlerweile auf eine quellcodefreie Lösung gekommen:
  1. Erst 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 (lpar\^\[[^]]*\]) in 1.txt durch \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 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.
Uli Gerhardt
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

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

  Alt 30. Aug 2012, 13:14
Das wäre vielleicht ein Job für den Stream Editor (SED) gewesen.
einige SED Beispiele: http://sed.sourceforge.net/sed1line_de.html
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#9

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

  Alt 30. Aug 2012, 13:18
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. An der Uni haben wir mit sed und awk coole Sachen gemacht...
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#10

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

  Alt 30. Aug 2012, 13:45
Warum so umständlich?
Im Manual findet sich folgender Parameter:
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:54 Uhr.
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