ubuntuusers.de

grep und reguläre Ausdrücke

Status: Ungelöst | Ubuntu-Version: Lubuntu 13.10 (Saucy Salamander)
Antworten |

bu-cipolla

Avatar von bu-cipolla

Anmeldungsdatum:
9. März 2013

Beiträge: 114

Wohnort: Köln

Hallo zusammen,

ich probiere mit dem Befehl grep herum und mit regulären Ausdrücken. Ich möchte in einem Text alle dreistelligen Zahlen erreichen. Mit

grep -E '[0-9]{3,3}' Datei.txt

sind im Suchergebnis aber auch:

1988

ISBN 3 406 05782 9

125.000 Euro

Was mache ich falsch??

bu

D630

Avatar von D630

Anmeldungsdatum:
24. Juli 2013

Beiträge: 329

Hi,

das sollte funktionieren (es gibt bestimmt aber noch etwas besseres):

1
grep -E -o '\<[0-9]{3,3}\>'

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13211

bu-cipolla schrieb:

Was mache ich falsch??

Dir fehlen die Anker. Du willst wahrscheinlich alle Zahlen mit drei Ziffern erwischen, die von Nicht-Zahlen umgeben sind. Das kann man auf unterschiedliche Arten und Weisen erreichen - und es hängt auch davon ab, was Du mit dem Suchergebnis machen willst. Eine einfache ist eine Wortgrenze:

$ echo -e '1988\nISBN 3 406 05782 9\n125.000 Euro'
1988
ISBN 3 406 05782 9
125.000 Euro
$ echo -e '1988\nISBN 3 406 05782 9\n125.000 Euro' | egrep '\<[0-9]{3}\>'
ISBN 3 406 05782 9
125.000 Euro 

Wie Du siehst, hilft das aber auch nicht ganz gegen ungewünschte Ergebnisse. Du müsstest noch mehr über Deine Eingaben verraten und darüber, was Du erreichen willst.

Ciao

robert

bu-cipolla

(Themenstarter)
Avatar von bu-cipolla

Anmeldungsdatum:
9. März 2013

Beiträge: 114

Wohnort: Köln

Danke D630 und rklm!

Mir geht es darum, zu verstehen, wie die Logik von regulären Ausdrücken ist. Ich finde es etwas sperrig. Wenn ich doch klar anweise, dass ich einen String suche, der mindestens 3 uns höchstens 3 Zahlen lang sein soll {3,3}, wieso dann eine Zahl wie 1988 gefunden wird. Ich kann jetzt mit eurer Hilfe nachvollziehen, dass man zusätzlich anweisen muss, dass der String einen Wortanfang und ein Wortende haben muss. Damit funktioniert es ja auch tatsächlich. Das dann eben auch ISBN 3 406 05782 und 125.000 Eurogefunden wird, damit kann ich leben. Diese Strings werden eben wegen der Leerstellen und des Punktes als mehrere Worte gedeutet.

Zudem ist die Option -o interessan, dann werden ja nur die gefundenen Strings ausgegeben uns nicht die Textzeile.

Also Danke für die Hilfe!

bu

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13211

bu-cipolla schrieb:

Mir geht es darum, zu verstehen, wie die Logik von regulären Ausdrücken ist. Ich finde es etwas sperrig. Wenn ich doch klar anweise, dass ich einen String suche, der mindestens 3 uns höchstens 3 Zahlen lang sein soll {3,3}, wieso dann eine Zahl wie 1988 gefunden wird.

Nun ja, es gibt halt in "1988" eine Zahl mit drei Ziffern. So einfach ist das. ☺

Du brauchst übrigens nur "{3}" und nicht "{3,3}".

Ich kann jetzt mit eurer Hilfe nachvollziehen, dass man zusätzlich anweisen muss, dass der String einen Wortanfang und ein Wortende haben muss.

Nein, so allgemein kann man das auch wieder nicht sagen. Die Strategie hängt ganz entschieden von den Eingaben und davon ab, was man erreichen möchte.

Für das Lernen empfehle ich immer den Regex Coach (läuft auch unter WINE): da kann man zusehen, wie das Matchen vor sich geht. Generell muss man zwar immer noch darauf achten, dass verschiedene Regex-Engines verschiedene Optimierungen und Features haben, aber für die Grundlagen reicht das allemal.

Ciao

robert

Antworten |