Hallo ML, Ich bin mich momentan auf die LPIC1 am Vorbereiten und stoße bei grep auf ein paar Verständnisprobleme: Ich habe folgende Datei angelegt, man beachte bitte auch die Leerzeilen: pc53082:~ # cat greptest # Kommentar 111 1111 # noch nen Kommentar pc53082:~ # pc53082:~ # grep [^#] greptest # Kommentar 111 1111 # noch nen Kommentar Nach meinem Verständnis sollte hier alle Zeilen angezeigt werden, in denen _kein_ # enthalten ist. Wieso werden dann hier die Kommentarzeilen angezeigt ? Liegt das daran, daß man strenggenommen, lt. manpage, in den brackets nur Bereiche angeben darf ? 2. Problem: pc53082:~ # grep -v ^[#] greptest 111 1111 pc53082:~ # grep ^[^#] greptest 111 1111 pc53082:~ # Hier sollten nach meinem Dafürhalten beide Zeilen das gleiche Ergebnis hervorrufen, nämlich alle Zeilen, die _nicht_ mit # anfangen. Einmal werden die Leerzeilen mit angezeigt, einmal nicht. Wieso ? Eine Leerzeile ist auch eine Zeile, die nicht mit # beginnt. Oder gilt, daß eine Leerzeile mit überhaupt keinem Zeichen beginnt ? Laut "LPIC-1" von Harald Maaßen aus dem Galileoverlag sollten beide Kommandos auch die Leerzeilen mit ausgeben. Hmm. Danke für erhellende Kommentare. Bernd -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Moin Bernd,
Am Sun, 7 Feb 2010 21:29:55 +0100
schrieb "Lentes, Bernd"
pc53082:~ # grep [^#] greptest
grep "^#" greptest Die [] haben nen anderen Sinn: zb. [gG] = findet alle kleine und große G oder [1-5] = finde alle Zahlen von 1 bis 5 etc. [^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten. Detlef -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Sonntag 07 Februar 2010 21:59 schrieb Detlef Reichelt:
[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten.
Ich hoffe ich blamiere mich jetzt nicht: Liefert [^#] nicht alle Zeilen, die ein anderes Zeichen als # enthalten? Also auch z.B. # Kommentar weil es ja ein "K" enthält. lg Ralf -- Antworten bitte nur in die Mailingliste! PMs bitte an: listpm (@) arndt-de (.) eu -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Mon, 8 Feb 2010 09:12:25 +0100
schrieb Ralf Arndt
Am Sonntag 07 Februar 2010 21:59 schrieb Detlef Reichelt:
[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten.
Ich hoffe ich blamiere mich jetzt nicht: Liefert [^#] nicht alle Zeilen, die ein anderes Zeichen als # enthalten? Also auch z.B. # Kommentar weil es ja ein "K" enthält.
Stimmt, so wars. ;) Detlef -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Sonntag 07 Februar 2010 21:59 schrieb Detlef Reichelt:
[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten.
Ich hoffe ich blamiere mich jetzt nicht: Liefert [^#] nicht alle Zeilen, die ein anderes Zeichen als # enthalten? Also auch z.B. # Kommentar weil es ja ein "K" enthält.
Stimmt, so wars. ;)
Also ich würde sagen, dass der Ausdruck [^#] bedeutet, dass jedes Zeichen gefunden wird, welches kein # ist. Will man den Zeilenanfang haben, müsste man sowas hier machen: ^[^#] Dieser Ausdruck findet Zeilen, die nicht mit einem # beginnen.
Marko Känig schrieb:
Also ich würde sagen, dass der Ausdruck [^#] bedeutet, dass jedes Zeichen gefunden wird, welches kein # ist.
Will man den Zeilenanfang haben, müsste man sowas hier machen:
^[^#]
Dieser Ausdruck findet Zeilen, die nicht mit einem # beginnen.
Hallo Marko, Genau das hat bei mir nicht geklappt. Dieser Aufruf hat die Leerzeilen unterschlagen. Ich kriege immer mehr den Eindruck, daß die brackets [] nür für Bereiche zu nehmen sind, und nicht für ein einzelnes Zeichen. Bernd-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Monday 08 February 2010 11:50:41 Lentes, Bernd wrote:
Marko Känig schrieb:
Also ich würde sagen, dass der Ausdruck [^#] bedeutet, dass jedes Zeichen gefunden wird, welches kein # ist.
Will man den Zeilenanfang haben, müsste man sowas hier machen:
^[^#]
Dieser Ausdruck findet Zeilen, die nicht mit einem # beginnen.
Hallo Marko,
Genau das hat bei mir nicht geklappt. Dieser Aufruf hat die Leerzeilen unterschlagen. Ich kriege immer mehr den Eindruck, daß die brackets [] nür für Bereiche zu nehmen sind, und nicht für ein einzelnes Zeichen.
[abcd] bezeichnet *ein* Zeichen aus der genannten Menge. Das Zeilenende ist *kein* Zeichen. ^[^#] ebenso wie ^. passen daher nicht auf eine Leerzeile. Hier ein Beispiel: Als erstes die Daten: $ cat <<<"$x" 1 #2 # 4 5 Hier das, was Du wahrscheinlich erreichen willst. Alle Zeilen außer denen mit '#' am Anfang bleiben erhalten (geht übrigens besser mit grep -v) Zum Verständnis: Suche nach Zeilen, die mit einem Zeichen außer # oder mit dem Zeilenende beginnen. $ grep '^\([^#]\|$\)' <<<"$x" 1 4 5 Torsten -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Torsten Förtsch schrieb:
On Monday 08 February 2010 11:50:41 Lentes, Bernd wrote:
Marko Känig schrieb:
[abcd] bezeichnet *ein* Zeichen aus der genannten Menge. Das Zeilenende ist *kein* Zeichen. ^[^#] ebenso wie ^. passen daher nicht auf eine Leerzeile.
Hier ein Beispiel:
Als erstes die Daten: $ cat <<<"$x" 1
#2
#
4 5
Hier das, was Du wahrscheinlich erreichen willst. Alle Zeilen außer denen mit '#' am Anfang bleiben erhalten (geht übrigens besser mit grep -v) Zum Verständnis: Suche nach Zeilen, die mit einem Zeichen außer # oder mit dem Zeilenende beginnen. $ grep '^\([^#]\|$\)' <<<"$x" 1
4 5
Um bei dem Beispiel von Bernd zu bleiben: $ grep -v "^#" greptest 111 1111 gibt genau die Leerzeilen mit aus. -- Gruß Axel -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 08 Feb 2010, Marko Käning schrieb:
^[^#]
Dieser Ausdruck findet Zeilen, die nicht mit einem # beginnen.
Um Kommentare zu löschen empfiehlt sich folgendes: grep -v '^[[:space:]]*#\|^[[:space:]]*$' Oder ==== #!/usr/bin/sed -f /^[[:space:]]*#/d /^[[:space:]]*$/d ==== Das kann man z.B. als ~/bin/delcomments speichern und ausführbar machen. -dnh -- Und da ich falsch geschrieben habe, was ja flasch ist, da faslch richtig ge- schrieben ja richtig und nicht falcsh ist, hab ich durch das richtige schrei- ben einen Fehler gemacht und damit das Wort flasch richtig verwendet, da es ja flashc ist, was hier nicht richtig, aber passend ist. -- Till Potinius -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Lentes, Bernd [07.02.2010 21:29]:
Hallo ML,
Ich bin mich momentan auf die LPIC1 am Vorbereiten und stoße bei grep auf ein paar Verständnisprobleme: Ich habe folgende Datei angelegt, man beachte bitte auch die Leerzeilen:
pc53082:~ # cat greptest
# Kommentar 111 1111 # noch nen Kommentar
pc53082:~ #
pc53082:~ # grep [^#] greptest # Kommentar 111 1111 # noch nen Kommentar
Nach meinem Verständnis sollte hier alle Zeilen angezeigt werden, in denen _kein_ # enthalten ist. Wieso werden dann hier die Kommentarzeilen angezeigt ? Liegt das daran, daß man strenggenommen, lt. manpage, in den brackets nur Bereiche angeben darf ?
2. Problem: pc53082:~ # grep -v ^[#] greptest
111 1111
pc53082:~ # grep ^[^#] greptest 111 1111 pc53082:~ # Hier sollten nach meinem Dafürhalten beide Zeilen das gleiche Ergebnis hervorrufen, nämlich alle Zeilen, die _nicht_ mit # anfangen. Einmal werden die Leerzeilen mit angezeigt, einmal nicht. Wieso ? Eine Leerzeile ist auch eine Zeile, die nicht mit # beginnt. Oder gilt, daß eine Leerzeile mit überhaupt keinem Zeichen beginnt ? Laut "LPIC-1" von Harald Maaßen aus dem Galileoverlag sollten beide Kommandos auch die Leerzeilen mit ausgeben. Hmm.
Danke für erhellende Kommentare.
Eine Leerzeile besteht aus keinem Zeichen. Nur die beiden Positionen Zeilenanfang (^) und Zeilenende ($) existieren. [^#] ist eine Zeichenklasse. Sie enthält alle Zeichen außer # (siehe Mail von Ralf Arndt). grep -v ^[#] sucht Zeilen, die nicht mit einem # beginnen. Dazu gehören Leerzeilen. grep ^[^#] sucht Zeilen, die mit einem anderen Zeichen als # beginnen. Eine Leerzeile hat aber kein Zeichen, also beginnt sie auch nicht mit einem anderen Zeichen als # :-) Eine Zeile, die aus einem (oder mehreren) Whitespace besteht, ist in diesem Sinne keine Leerzeile. Nahezu unentbehrliche Lektüre *seufz* dazu ist http://www.87871.com/tool/help/Mastering%20Regular%20Expressions,%203rd%20Ed.... HTH Werner -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Werner Flamme schrieb:
Eine Leerzeile besteht aus keinem Zeichen. Nur die beiden Positionen Zeilenanfang (^) und Zeilenende ($) existieren.
[^#] ist eine Zeichenklasse. Sie enthält alle Zeichen außer # (siehe Mail von Ralf Arndt).
Nur noch 'mal zur Sicherheit: Sprich: grep [^#] bedeutet _nicht_, "zeige alle Zeilen, die kein # enthalten", _sondern_ "zeige alle Zeilen, die ein anderes Zeichen als # enthalten" ?
grep -v ^[#] sucht Zeilen, die nicht mit einem # beginnen. Dazu gehören Leerzeilen.
grep ^[^#] sucht Zeilen, die mit einem anderen Zeichen als # beginnen. Eine Leerzeile hat aber kein Zeichen, also beginnt sie auch nicht mit einem anderen Zeichen als # :-)
Nahezu unentbehrliche Lektüre *seufz* dazu ist <http://www.87871.com/tool/help/Mastering%20Regular%20Expressi ons,%203rd%20Edition/0596528124/toc.html>.
Guck ich mir mal an. Dann ist das, was Detlef geschrieben hat, nicht richtig ? Zitat: "[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten." Bernd-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Bernd, Lentes, Bernd schrieb:
Werner Flamme schrieb:
Eine Leerzeile besteht aus keinem Zeichen. Nur die beiden Positionen Zeilenanfang (^) und Zeilenende ($) existieren.
[^#] ist eine Zeichenklasse. Sie enthält alle Zeichen außer # (siehe Mail von Ralf Arndt).
Nur noch 'mal zur Sicherheit: Sprich: grep [^#] bedeutet _nicht_, "zeige alle Zeilen, die kein # enthalten", _sondern_ "zeige alle Zeilen, die ein anderes Zeichen als # enthalten" ?
lies Dir noch einmal in Ruhe die folgenden Zeilen durch. Hilfe: was macht ein grep -v ? was bedeutet das Muster: 1) [^#] ? 2) ^[#] ? 3) Warum ist der Ausdruck aus 2) gleich wie dieser hier; "^#" ?? Dann bitte mit grep ausprobieren (So kommst Du am ehesten zum Ziel ;-) ). Als Hilfe noch: wenn Du "[^#]" benutzt, gibst Du mit [ ] (den Klammern) eine Gruppe von Zeichen an, nach denen Du suchst. [1] zu 2):
grep -v ^[#] sucht Zeilen, die nicht mit einem # beginnen. Dazu gehören Leerzeilen.
zu 1):
grep ^[^#] sucht Zeilen, die mit einem anderen Zeichen als # beginnen. Eine Leerzeile hat aber kein Zeichen, also beginnt sie auch nicht mit einem anderen Zeichen als # :-)
[1] http://de.wikibooks.org/wiki/Linux-Kompendium:_Shellprogrammierung#Mustererk... -- Gruß Axel -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Lentes, Bernd [08.02.2010 13:25]:
Werner Flamme schrieb:
Eine Leerzeile besteht aus keinem Zeichen. Nur die beiden Positionen Zeilenanfang (^) und Zeilenende ($) existieren.
[^#] ist eine Zeichenklasse. Sie enthält alle Zeichen außer # (siehe Mail von Ralf Arndt).
Nur noch 'mal zur Sicherheit: Sprich: grep [^#] bedeutet _nicht_, "zeige alle Zeilen, die kein # enthalten", _sondern_ "zeige alle Zeilen, die ein anderes Zeichen als # enthalten" ?
grep -v ^[#] sucht Zeilen, die nicht mit einem # beginnen. Dazu gehören Leerzeilen.
grep ^[^#] sucht Zeilen, die mit einem anderen Zeichen als # beginnen. Eine Leerzeile hat aber kein Zeichen, also beginnt sie auch nicht mit einem anderen Zeichen als # :-)
Nahezu unentbehrliche Lektüre *seufz* dazu ist <http://www.87871.com/tool/help/Mastering%20Regular%20Expressi ons,%203rd%20Edition/0596528124/toc.html>.
Guck ich mir mal an.
Dann ist das, was Detlef geschrieben hat, nicht richtig ? Zitat: "[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten."
Wenn das (wie hier) ^ an erster Stelle einer Zeichenklasse steht, bedeutet es die Negation der Zeichenklasse. Steht es an anderer Stelle der Zeichenklasse, bedeutet es das Zeichen ^. [^#] -> alle Zeichen, die nicht # sind [#^] -> sowohl # als auch ^ dürfen an dieser Stelle vorkommen. Ist keine Stelle angegeben, gilt analog "in dieser Zeile" ^ in einer Zeichenklasse steht nie für den Zeilenanfang, denn der Zeilenanfang ist eine Position und kein Zeichen - und eine Zeichenklasse besteht nun mal aus Zeichen und nicht aus Positionen ;-) Das findest Du alles bei Mr. Friedl, spätestens nach dem 10. Einschlafen über der Lektüre ;-) Gilt zumindest für die 2. Auflage... HTH Werner -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Werner Flamme schrieb:
grep -v ^[#] sucht Zeilen, die nicht mit einem # beginnen. Dazu gehören Leerzeilen.
grep ^[^#] sucht Zeilen, die mit einem anderen Zeichen als
# beginnen.
Eine Leerzeile hat aber kein Zeichen, also beginnt sie auch nicht mit einem anderen Zeichen als # :-)
Nahezu unentbehrliche Lektüre *seufz* dazu ist <http://www.87871.com/tool/help/Mastering%20Regular%20Expressi ons,%203rd%20Edition/0596528124/toc.html>.
Guck ich mir mal an.
Dann ist das, was Detlef geschrieben hat, nicht richtig ? Zitat: "[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten."
Wenn das (wie hier) ^ an erster Stelle einer Zeichenklasse steht, bedeutet es die Negation der Zeichenklasse. Steht es an anderer Stelle der Zeichenklasse, bedeutet es das Zeichen ^. [^#] -> alle Zeichen, die nicht # sind [#^] -> sowohl # als auch ^ dürfen an dieser Stelle vorkommen. Ist keine Stelle angegeben, gilt analog "in dieser Zeile"
^ in einer Zeichenklasse steht nie für den Zeilenanfang, denn der Zeilenanfang ist eine Position und kein Zeichen - und eine Zeichenklasse besteht nun mal aus Zeichen und nicht aus Positionen ;-)
Das findest Du alles bei Mr. Friedl, spätestens nach dem 10. Einschlafen über der Lektüre ;-) Gilt zumindest für die 2. Auflage...
Hallo Werner, Allmählich lichtet sich der Nebel. Kannst Du mir bitte auf folgende Fragen eine eindeutige Antwort geben ? 1. grep [^#] bedeutet _nicht_, "zeige alle Zeilen, die kein # enthalten", _sondern_ "zeige alle Zeilen, die ein anderes Zeichen als # enthalten" ? 2. "[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten." Stimmt insofern nicht, als daß das ^ hier nichts mit dem Zeilenanfang zu tun hat. Frustierend, wenn in einem Buch zur LPI-Vorbereitung drin steht (das auch noch 35,-- € kostet), daß "grep -v [#] Datei" und "grep [^#] Datei" das gleiche seien. Ich hatte bei dem Buch von Harald Maaßen schon an zwei anderen Stellen den Eindruck, das da was nicht stimmt. Bernd
Hallo, Am Mon, 08 Feb 2010, Lentes, Bernd schrieb:
1. grep [^#] bedeutet _nicht_, "zeige alle Zeilen, die kein # enthalten", _sondern_ "zeige alle Zeilen, die ein anderes Zeichen als # enthalten" ?
Ja.
2. "[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten."
Nein.
Stimmt insofern nicht, als daß das ^ hier nichts mit dem Zeilenanfang zu tun hat.
Genau. Negation der Zeichenklasse.
Frustierend, wenn in einem Buch zur LPI-Vorbereitung drin steht (das auch noch 35,-- € kostet), daß "grep -v [#] Datei" und "grep [^#] Datei" das gleiche seien.
Jap. Zumal: wenn da die REs wirklich so ohne Quotes drinstehen... Würde ich das als "auto-disqualifiziert" bezeichnen. Siehe auch meine andere Mail. Tatsächlich äquivalent sind: grep -v '^#' Datei ### zeige keine Zeilen die mit # beginnen und grep '^[^#]' Datei ### zeige alle Zeilen, die nicht mit # beginnen Analysiere mal beide RE (und die Negation durch '-v') "zeichenweise" anhand von 'man 7 regex' oder 'man grep' (und meinen Kommentaren ;) HTH, -dnh -- "But you should never let rules overrule common sense - if you do, you end up doing stupid things" -- Linus Torvalds -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
David Haller schrieb:
Hallo,
Am Mon, 08 Feb 2010, Lentes, Bernd schrieb:
1. grep [^#] bedeutet _nicht_, "zeige alle Zeilen, die kein # enthalten", _sondern_ "zeige alle Zeilen, die ein anderes Zeichen als # enthalten" ?
Ja.
2. "[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten."
Nein.
Stimmt insofern nicht, als daß das ^ hier nichts mit dem Zeilenanfang zu tun hat.
Genau. Negation der Zeichenklasse.
Danke für die klare Antwort.
Tatsächlich äquivalent sind:
grep -v '^#' Datei ### zeige keine Zeilen die mit # beginnen und grep '^[^#]' Datei ### zeige alle Zeilen, die nicht mit # beginnen
Tut mir leid, Dich enttäuschen zu müssen: pc53082:~ # grep -v '^#' greptest 111 1111 11 # ein Kommentar hinten dran pc53082:~ # pc53082:~ # grep '^[^#]' greptest 111 1111 11 # ein Kommentar hinten dran pc53082:~ # "grep -v '^#'" zeigt alle Zeilen an, die nicht mit # anfangen. Eine Leerzeile fängt nicht mit # an. "grep '^[^#]'" zeigt alle Zeilen an, die mit einem anderen Zeichen als # anfangen. Eine Leerzeile fängt nicht mit einem anderen Zeichen als # an, sondern mit überhaupt keinem Zeichen. Und wenn das jetzt so nicht stimmt, habe ich in den letzten Stunden gar nichts gelernt und bin todtraurig. Schnief. Bernd-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 08 Feb 2010, Lentes, Bernd schrieb:
David Haller schrieb:
Am Mon, 08 Feb 2010, Lentes, Bernd schrieb:
1. grep [^#] bedeutet _nicht_, "zeige alle Zeilen, die kein # enthalten", _sondern_ "zeige alle Zeilen, die ein anderes Zeichen als # enthalten" ?
Ja.
2. "[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten."
Nein.
Stimmt insofern nicht, als daß das ^ hier nichts mit dem Zeilenanfang zu tun hat.
Genau. Negation der Zeichenklasse.
Danke für die klare Antwort.
Lt. den Gurus sollte man übrigens '!' statt '^' dafür verwenden. Also z.B. '[!a-z]' statt '[^a-z]'.
Tatsächlich äquivalent sind:
grep -v '^#' Datei ### zeige keine Zeilen die mit # beginnen und grep '^[^#]' Datei ### zeige alle Zeilen, die nicht mit # beginnen
Tut mir leid, Dich enttäuschen zu müssen:
pc53082:~ # grep -v '^#' greptest
111 1111 11 # ein Kommentar hinten dran
Tut wie spezifiziert.
pc53082:~ #
pc53082:~ # grep '^[^#]' greptest 111 1111 11 # ein Kommentar hinten dran pc53082:~ #
Tut wie spezifiziert. Nur mein Kommentar war faschl. Korrekt: ### zeige alle Zeilen, die nicht mit # beginnen und mind. 1 ### Zeichen != '#' am Anfang enthalten. bzw. $ grep '^[^#]\|^$' greptest Für den Sonderfall der leeren Zeilen, war ich wohl einfach schon zu müde. BTW: ich hoffe, du machst solche Experimente nicht als root ...
"grep -v '^#'" zeigt alle Zeilen an, die nicht mit # anfangen. Eine Leerzeile fängt nicht mit # an. "grep '^[^#]'" zeigt alle Zeilen an, die mit einem anderen Zeichen als # anfangen. Eine Leerzeile fängt nicht mit einem anderen Zeichen als # an, sondern mit überhaupt keinem Zeichen.
Und wenn das jetzt so nicht stimmt, habe ich in den letzten Stunden gar nichts gelernt und bin todtraurig. Schnief.
Doch hast du. Stimmt so. Macht den Eindruck, daß du was entscheidendes bzgl. Regex gelernt hast ;) Ansonsten siehe meine Antwort "oben" im Thread in der auch die sed-Variante steht. -dnh -- A monk. A punk. A chick. In a kick-ass flick. -- Bulletproof Monk -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Lentes, Bernd [08.02.2010 15:23]:
Werner Flamme schrieb:
grep -v ^[#] sucht Zeilen, die nicht mit einem # beginnen. Dazu gehören Leerzeilen.
grep ^[^#] sucht Zeilen, die mit einem anderen Zeichen als # beginnen. Eine Leerzeile hat aber kein Zeichen, also beginnt sie auch nicht mit einem anderen Zeichen als # :-) Nahezu unentbehrliche Lektüre *seufz* dazu ist <http://www.87871.com/tool/help/Mastering%20Regular%20Expressi ons,%203rd%20Edition/0596528124/toc.html>.
Guck ich mir mal an.
Dann ist das, was Detlef geschrieben hat, nicht richtig ? Zitat: "[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten."
Wenn das (wie hier) ^ an erster Stelle einer Zeichenklasse steht, bedeutet es die Negation der Zeichenklasse. Steht es an anderer Stelle der Zeichenklasse, bedeutet es das Zeichen ^. [^#] -> alle Zeichen, die nicht # sind [#^] -> sowohl # als auch ^ dürfen an dieser Stelle vorkommen. Ist keine Stelle angegeben, gilt analog "in dieser Zeile"
^ in einer Zeichenklasse steht nie für den Zeilenanfang, denn der Zeilenanfang ist eine Position und kein Zeichen - und eine Zeichenklasse besteht nun mal aus Zeichen und nicht aus Positionen ;-)
Das findest Du alles bei Mr. Friedl, spätestens nach dem 10. Einschlafen über der Lektüre ;-) Gilt zumindest für die 2. Auflage...
Hallo Werner,
Allmählich lichtet sich der Nebel. Kannst Du mir bitte auf folgende Fragen eine eindeutige Antwort geben ?
1. grep [^#] bedeutet _nicht_, "zeige alle Zeilen, die kein # enthalten", _sondern_ "zeige alle Zeilen, die ein anderes Zeichen als # enthalten" ?
Ja. Das erstere könnte man mit grep -v '#' datei erreichen
2. "[^#] findet also alle Zeilen, die entweder mit irgendwas beginnen "^" (daher auch nicht die leeren Zeilen) oder nen "#" enthalten." Stimmt insofern nicht, als daß das ^ hier nichts mit dem Zeilenanfang zu tun hat.
Der Ausdruck hat mit "Beginnen" nichts zu tun. Zeilen, die mit einem # beginnen, findest Du mit grep '^#' datei Alle Zeilen beginnen mit irgendwas, aber manche enthalten auch irgendwas ;-) Zeige alle Zeilen, die mit '#' beginnen: grep '^#' datei (Zeilenbeginn, unmittelbar gefolgt von '#') Zeige alle Zeilen, die nicht mit '#' beginnen grep ^[^#]' datei (Zeilenbeginn, unmittelbar gefolgt von einem Zeichen, das kein '#' ist - und ein Zeilenende ist kein Zeichen, es sei denn, man gibt es durch eine Option so an *seufz*) Zeige alle Zeilen, die ein '#' enthalten grep '#' datei Zeige alle Zeilen, die kein '#' enthalten grep -v '#' datei
Frustierend, wenn in einem Buch zur LPI-Vorbereitung drin steht (das auch noch 35,-- € kostet), daß "grep -v [#] Datei" und "grep [^#] Datei" das gleiche seien. Ich hatte bei dem Buch von Harald Maaßen schon an zwei anderen Stellen den Eindruck, das da was nicht stimmt.
Harald Maaßen kenne ich nicht. Ich bevorzuge die Bücher von Peer Heinlein zu LPIC-1 und von Anke Börnig für LPIC-2, etwa https://www.opensourcepress.de/professional_ref.html. Ich habe den LPIC-1-Vorbereitungs-Kurs bei Peer himself besucht ;-) grep -v [#] datei lässt schon die Frage entstehen, was die eckigen Klammern da machen. Eine Zeichenklasse aus einem Zeichen ist was? Hm. Und ich sach' noch, lies den Friedl... :-) Gruß Werner -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 08 Feb 2010, Werner Flamme schrieb: [..]
grep -v ^[#] sucht Zeilen, die nicht mit einem # beginnen. Dazu gehören Leerzeilen.
Noch ne Anmerkung dazu: Argumente für grep sollte man _immer_ quoten. Unter umständen frisst sonst nämlich schon die Shell die Zeichen weg. Sieht man prima wenn 'set -x' gesetzt ist. $ set -x $ grep [a-z] foo.txt >/dev/null + grep t foo.txt Dieser Aufruf von grep ist nicht so ganz das was man will... $ grep [a-z]*.* foo.txt >/dev/null + grep [DATEILISTE] foo.txt DATEILISTE = alle Dateinamen im aktuellen Verzeichnis die mit Kleinbuchstaben beginnen und nen . enthalten ... Der auch nicht. $ grep '[a-z]' foo.txt >/dev/null + grep '[a-z]' foo.txt Das schaut doch schon besser aus, odr? Also, wie immer: QUOTEN!
Nahezu unentbehrliche Lektüre *seufz* dazu ist http://www.87871.com/tool/help/Mastering%20Regular%20Expressions,%203rd%20Ed....
Mir reichten bisher 'man 7 regex', man awk, man grep, und v.a. man -k perlre ;) -dnh -- I believe the technical term is "Oops!" -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
David Haller [08.02.2010 13:48]:
Mir reichten bisher 'man 7 regex', man awk, man grep, und v.a. man -k perlre ;)
Wenn wir jetzt in d.a.s.r. wären, würde ich kommentieren "Ja, das bist Du - aber andere sind bei der Geburt nicht aus dem Diskettenschlitz gefallen" SCNR Werner -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (8)
-
Axel Birndt
-
David Haller
-
Detlef Reichelt
-
Lentes, Bernd
-
Marko Käning
-
Ralf Arndt
-
Torsten Förtsch
-
Werner Flamme