Regular Expressions - geloest

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
Benutzeravatar
Miksch
Beiträge: 1223
Registriert: 11.04.2005 13:45:48

Regular Expressions - geloest

Beitrag von Miksch » 29.08.2008 16:51:38

Hallo Forum,
ich beschaeftige mich gerade mit regex.
Ich habe einen (Uebungs)text aus dem ich alle Zeilen die ein a,b oder u enthalten herausfiltern moechte.
Dazu habe ich folgendes Kommando eingegeben:

Code: Alles auswählen

§grep '[^abu]' Übungstext
Es wird dennoch der gesamte Text mit a,b und u ausgegeben. Was koennte bei meinem Kommando verkehrt sein?
TIA und viele Gruesse,
Miksch

P.S.: Ergänzung:
Zusätzlich habe ich an den Anfang einiger Wörter Ziffern oder andere nicht-alphabetische Zeichen gesetzt, das Gleiche am Ende.
Die Kommandos:

Code: Alles auswählen

§grep \< Uebungstext
und

Code: Alles auswählen

§grep \> Uebungstext
filtern leider auch hier nichts heraus.
Zuletzt geändert von Miksch am 29.08.2008 17:34:16, insgesamt 1-mal geändert.

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: Regular Expressions

Beitrag von Spasswolf » 29.08.2008 17:04:59

So dürfen zwischen Zeilenanfang und Ende kein a,b oder u stehen:

Code: Alles auswählen

grep '^[^abu]*$'
Dein regex passt auf jede Zeile, die noch ein anderes Zeichen außer a,b und u enthält.
Zuletzt geändert von Spasswolf am 29.08.2008 17:23:56, insgesamt 1-mal geändert.

Benutzeravatar
Miksch
Beiträge: 1223
Registriert: 11.04.2005 13:45:48

Re: Regular Expressions

Beitrag von Miksch » 29.08.2008 17:16:32

Danke Spasswolf!
Ich habe Deinen Ausdruck ausprobiert. Er hat das gleiche Ergebnis wie meiner.
Warum meinst Du das mein Ausdruck auf jede Zeile passt die noch ein anderes Zeichen als a,b und u enthaelt?
Ich verstehe die Zeichen so, das ^ in eckigen Klammern die in den Klammern stehenden Zeichen ausschliesst. Also alle Zeilen die kein a,b oder u enthalten angezeigt werden muessten. Mache ich da einen Denkfehler?
Gruss,
Miksch

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: Regular Expressions

Beitrag von Spasswolf » 29.08.2008 17:24:32

Ich hab den Ausdruck korrigiert, da war ein Sternchen zu viel.

Dein Denkfehler: Die Regex kann auch auf Teile der Zeile passen, und grep gibt dann die gesamte Zeile aus, z.b:

Code: Alles auswählen

$ echo abug | grep '[^abu]'
abug
gibt abug aus, da [^abu] auf g passt.

Benutzeravatar
striker2150
Beiträge: 158
Registriert: 23.07.2004 20:46:22

Re: Regular Expressions

Beitrag von striker2150 » 29.08.2008 17:31:48

Normalerweise ist [] eine Zeichenklasse.

Wenn man innerhalb einer Zeichenklasse z.B. folgendes schreibt [^ab], bedeutet das alle Zeichen außer a und b.

Wenn man aber ^[ab] schreibt matched die regex, wenn Am Zeilenanfang ein a oder b steht.

Folglich matched ^[^ab] auf alle Zeilen, die nicht mit a oder b beginnen.

Ich kenn das aber eher aus PERL aber ich denke nicht, dass das bei grep anders ist.

Wenn Du aber z.B. nur bestimmte Zeichen rauslöschen willst, solltest Du grep vergessen und dir mal sed anschauen.
Zuletzt geändert von striker2150 am 29.08.2008 17:34:40, insgesamt 1-mal geändert.

Benutzeravatar
Miksch
Beiträge: 1223
Registriert: 11.04.2005 13:45:48

Re: Regular Expressions

Beitrag von Miksch » 29.08.2008 17:33:47

Super! :)
Danke nochmals Spasswolf und natuerlich genauso Striker! Deinen Beitrag hatte ich zunaechst uebersehen. (Bin extrem kurzsichtig - kein Scherz!)
Jetzt habe ich es kapiert.
Viele Gruesse,
Miksch

P.S.: sed nehme ich mir als naechstes vor ;). Im Moment will ich 'nur' die regex verstehen und anzuwenden lernen. Ich habe im Moment keine konkrete Verwendung.

Antworten