ubuntuusers.de

grep Frage

Status: Gelöst | Ubuntu-Version: Ubuntu 8.10 (Intrepid Ibex)
Antworten |

ubuntu5001

Anmeldungsdatum:
17. März 2007

Beiträge: 639

Hallo Ubuntus!

Ich habe folgendes Problem. Ich möchte mir alle Wörter die mit "c" anfangen und in "h" enden ausgeben lassen. Warum funzt der erste Befehl der zweite aber nicht?

grep '\<c.*h\>' /usr/share/dict/words
grep '\<c*h\>' /usr/share/dict/words

Das Sternchen steht doch für beliebig viele Zeichen.

BadBoy

Avatar von BadBoy

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 479

ubuntu5001 schrieb:

Hallo Ubuntus!

Ich habe folgendes Problem. Ich möchte mir alle Wörter die mit "c" anfangen und in "h" enden ausgeben lassen. Warum funzt der erste Befehl der zweite aber nicht?

grep '\<c.*h\>' /usr/share/dict/words
grep '\<c*h\>' /usr/share/dict/words

Das Sternchen steht doch für beliebig viele Zeichen.

grep arbeitet mit Regulären Ausdrücken.

Ein Punkt bedeutet dabei: jedes beliebige Zeichen (genau einmal)

Ein Sternchen bedeutet: das zuvordefinierte Zeichen beliebig oft (auch kein Mal)

deine erste Abfrage ist also quasi:

finde alle Wörter, die mit c beginnen, auf das beliebig viele (auch keine) Zeichen folgen und mit h endet

die zweite dagegen:

finde alle Wörter, die am Anfang beliebig viele "c"s enthalten (auch keine) und auf die ein h folgt (welches am Schluss des Wortes steht)

radoe2

Anmeldungsdatum:
30. November 2006

Beiträge: 243

ubuntu5001 schrieb:

Hallo Ubuntus!

Ich habe folgendes Problem. Ich möchte mir alle Wörter die mit "c" anfangen und in "h" enden ausgeben lassen. Warum funzt der erste Befehl der zweite aber nicht?

grep '\<c.*h\>' /usr/share/dict/words
grep '\<c*h\>' /usr/share/dict/words

Das Sternchen steht doch für beliebig viele Zeichen.

Nein, dein zweites Beispiel matched auf eine beliebig lange Folge von 'c', gefolgt von einem 'h'. Das ist ein Unterschied zu deinem ersten Beisiel, das auf ein 'c', gefolgt von einer Folge beliebiger Zeichen, gefolgt von einem 'h' matched. grep implementiert keine Shellglobs (in denen '*' in der Tat eine Folge beliebiger Zeichen darstellt), sondern regex, bei denen der '*' die Bedeutung "0-n malige Wiedholung des vorherigen Zeichens/Zeichengruppe" hat. Für regex ist der '.' das beliebige Zeichen, '.*' damit eine Folge von 0-n beliebigen Zeichen.

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Der Punkt steht bei Regexe für "Jedes Zeichen auser Newline", ist also mit der Zeichenklasse "[^\n]" Vergleichbar, steht also nicht direkt für "Jedes beliebige Zeichen". Das mag zwar für grep uninteressant sein da es sowieso nur auf Zeilen matcht, spätestens aber wenn man Reguläre Ausdrücke in Programmiersprachen verwendet ist das schon ein unterschied der wichtig sein kann.

BadBoy

Avatar von BadBoy

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 479

so, jetzt dürfte das in aller Klarheit beantwortet sein =D

ubuntu5001

(Themenstarter)

Anmeldungsdatum:
17. März 2007

Beiträge: 639

Danke!

Antworten |