grep '[a-z,A-Z]{60}' datei.txt (Vorkommen 60 Male)
Hallo, ich will ein reguläres Muster der Häufigkeit 60 in einer Textdatei suchen: grep '[a-z,A-Z]{60}' .. aber es will nicht. Aus man grep: {n} The preceding item is matched exactly n times wer weiß weiter? thx Ekkard
Hier eine Nachbesserung: * Ekkard Gerlach (ich) schrieb:
ich will ein reguläres Muster der Häufigkeit 60 in einer Textdatei suchen:
grep "[a-z,A-Z]{60}" Datei.txt
.. aber es will nicht. Es gibt auch keine Fehlermeldung.
Es wird einfach nicht gefunden. Die Ausgabe ist leer. Ihr könnt es selber mit z.B. Euren Mailboxen testen: grep "[a-z,A-Z]{60}" suse-liste es reicht auch: grep "[a-z]{10}" suse-liste
Aus man grep: {n} The preceding item is matched exactly n times
wer weiß weiter?
thx Ekkard
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
* Ekkard Gerlach schrieb am 23.Dez.2001:
* Ekkard Gerlach (ich) schrieb:
ich will ein reguläres Muster der Häufigkeit 60 in einer Textdatei suchen:
grep "[a-z,A-Z]{60}" Datei.txt
.. aber es will nicht. Es gibt auch keine Fehlermeldung.
Geb mal grep "[a-zA-Z]\{60\}" Datei.txt ein. Ohne \ sucht grep nach { Ich weiß auch nie, ob da ein \ vor muß oder nicht, da sich grep, sed, vi, perl und was es sonst noch so gibt in diesem Punkt unterscheiden. Das , nur wenn Du danach suchen willst, ein Trenner ist nicht notwendig und gibt es auch nicht. Wenn innerhalb [...] ein , auftritt, so ist es Teil der Menge. Wenn es wirklich exakt 60 Buchstaben sein müssen, dann mußt Du es aber noch weiter eingrenzen. Etwa "^[a-zA-Z]\{60\}$" falls in der Zeile nur diese 60 Buchstaben auftauchen, und sonst nichst, oder etwa "[^a-zA-Z][a-zA-Z]\{60\}[^a-zA-Z]" falls auch noch andere Zeichen davor und danach auftauchen. Bernd -- LILO funktioniert nicht? Hast Du /etc/lilo.conf verändert und vergessen, lilo aufzurufen? Ist Deine /boot-Partition unter der 1024 Zylindergrenze? Bei anderen LILO Problemen mal in der SDB nachschauen: http://localhost/doc/sdb/de/html/rb_bootdisk.html |Zufallssignatur 6
Moin, Am Sonntag, 23. Dezember 2001 18:32 schrieb Bernd Brodesser:
grep "[a-z,A-Z]{60}" Datei.txt
.. aber es will nicht. Es gibt auch keine Fehlermeldung.
Geb mal grep "[a-zA-Z]\{60\}" Datei.txt ein. Ohne \ sucht grep nach { Ich weiß auch nie, ob da ein \ vor muß oder nicht, da sich grep, sed, vi, perl und was es sonst noch so gibt in diesem Punkt
Hmm, im meinen RegExp Buch v. Oreilly steht, daß die "{}" einen expliziten Bereich mit einem "min" und "max" Wert benötigen. IMHO meinen die damit, das ein Zeichen(o. RegExp) eben min und max vorhanden sein soll. grep "[a-zA-Z]\{60\}" datei.txt #Gibt min 60 Zeichen aus egrep "[a-zA-Z]{60}" datei.txt # Gibt min 60 Zeichen aus Jedenfalls unterstützen nicht _alle_ egrep Versionen die "{}". Bei der im Buch behandelten egrep Version sind die "\" nicht nötig.
unterscheiden. Das , nur wenn Du danach suchen willst, ein Trenner ist nicht notwendig und gibt es auch nicht. Wenn innerhalb [...] ein , auftritt, so ist es Teil der Menge.
ACK
Wenn es wirklich exakt 60 Buchstaben sein müssen, dann mußt Du es aber noch weiter eingrenzen. Etwa "^[a-zA-Z]\{60\}$" falls in der Zeile nur diese 60 Buchstaben auftauchen, und sonst nichst, oder etwa "[^a-zA-Z][a-zA-Z]\{60\}[^a-zA-Z]" falls auch noch andere Zeichen davor und danach auftauchen.
ACK Mit den exakt 60 Buchstaben bringt mir mein Ausdruck keinen Erfolg. Ciao Andre
Hallo Andre, * Andre Heine schrieb am 23.Dez.2001:
Am Sonntag, 23. Dezember 2001 18:32 schrieb Bernd Brodesser:
grep "[a-z,A-Z]{60}" Datei.txt
Geb mal grep "[a-zA-Z]\{60\}" Datei.txt ein. Ohne \ sucht grep nach { Ich weiß auch nie, ob da ein \ vor muß oder nicht, da sich grep, sed, vi, perl und was es sonst noch so gibt in diesem Punkt
Hmm, im meinen RegExp Buch v. Oreilly steht, daß die "{}" einen expliziten Bereich mit einem "min" und "max" Wert benötigen.
Wie geschrieben, die RegExp sind nicht einheitlich. Es ist ein Unterschied, ob Du grep oder sed, vi oder perl hast -- Leider. Auch unterscheiden sich verschiedene Versionen.
IMHO meinen die damit, das ein Zeichen(o. RegExp) eben min und max vorhanden sein soll.
Ist bei grep aber nicht der Fall.
grep "[a-zA-Z]\{60\}" datei.txt #Gibt min 60 Zeichen aus egrep "[a-zA-Z]{60}" datei.txt # Gibt min 60 Zeichen aus
Ja und egrep ist das Gleiche wie grep -E Aber das mit dem min 60 Zeichen stimmt so nicht. Es wird nach exakt 60 Zeichen gesucht, allerdings wenn da nichts davor und nichts danach steht, so wird natürlich auch mehr als 60 Zeichen gefunden, weil in mehr als 60 Zeichen auch eine Zeichenkette gibt, die aus exakt 60 Zeichen besteht. Hat man z.B egrep "1[a-zA-Z]{60}2" so wird eine Zeichenkette gefunden, die mit einer 1 beginnt, dan _exakt_ 60 Buchstaben hat und dann noch eine 2. Eine Zeichenkette die aus einer 1, 61 Buchstaben und eine 2 besteht wird hingegen nicht gefunden.
Jedenfalls unterstützen nicht _alle_ egrep Versionen die "{}".
Bei der im Buch behandelten egrep Version sind die "\" nicht nötig.
Nicht nötig heißt immer auch falsch. Es können nicht beide Varianten gehen. Wenn \{60\} geht, dann geht mit Sicherheit {60} nicht, und umgekehrt. Es kann nur sein, daß beide Varianten nicht gehen. Es kann aber nicht sein, daß beide Varianten gehen, denn es muß auch die Möglichkeit bestehen, daß man nach der Zeichenkette {60} sucht.
ACK Mit den exakt 60 Buchstaben bringt mir mein Ausdruck keinen Erfolg.
Hier gilt: Probieren geht vor Studieren. Kluge Bücher sind schön und nett, aber die Praxis mag anders sein. Bernd
On Mon, Dec 24, 2001 at 08:02:02AM +0100, Bernd Brodesser wrote:
* Andre Heine schrieb am 23.Dez.2001:
Am Sonntag, 23. Dezember 2001 18:32 schrieb Bernd Brodesser:
grep "[a-z,A-Z]{60}" Datei.txt
Geb mal grep "[a-zA-Z]\{60\}" Datei.txt ein. Ohne \ sucht grep nach { Ich weiß auch nie, ob da ein \ vor muß oder nicht, da sich grep, sed, vi, perl und was es sonst noch so gibt in diesem Punkt
Hmm, im meinen RegExp Buch v. Oreilly steht, daß die "{}" einen expliziten Bereich mit einem "min" und "max" Wert benötigen.
in allen Dokumentationen, die mir zur Verfuegung stehen, sind die schreibweise, {i}, {i,} oder {i,j} erlaubt, wobei j groesser i sein muss.
Wie geschrieben, die RegExp sind nicht einheitlich. Es ist ein Unterschied, ob Du grep oder sed, vi oder perl hast -- Leider.
Ja und nein, es sind gibt es zwei Variationen: Basic REs und 'extended' REs. grep benutzt Basic, "grep -E" oder egrep halt die erweiterten. "\{\}" wird bei BREs gebraucht, "{}" bei EREs. in sed(1) taucht die Abkuerzung BRE auf, was wohl fuer "Basic RE" steht. vi benutzt nach der vim-hilfe scheinbar BREs im Falle von vim mit Erweiterungen (und der Schreibweise "\{i}" *schuettel* ) Wenn man vi gegen die GNU libregex linkt wird man die GNU-Erweiterung \{\} wohl auch in vi nutzen koennen. Und perlre(1) haben eine eigene Manpage, es sind im Grunde aber extended REs mit Erweiterungen um Charakterklassen (Buchstaben, die Woerter bilden; Ziffern; Zeichen die Woerter trennen ...) Die Klassen gibt's auch in EREs, sind aber schreibintensiver. Aber richtig schlimm werden REs erst in PHP oder lisp-Code weil man dort die Backslashes quoten muss. Den gleichen Spass kann man auch an der Shell haben, wenn man des Ausdruck nicht in doublequotes packt. Peter -- man 7 regex
Hi Bernd, Am Montag, 24. Dezember 2001 08:02 schrieb Bernd Brodesser:
* Andre Heine schrieb am 23.Dez.2001:
Am Sonntag, 23. Dezember 2001 18:32 schrieb Bernd Brodesser:
grep "[a-z,A-Z]{60}" Datei.txt
Geb mal grep "[a-zA-Z]\{60\}" Datei.txt ein. Ohne \ sucht grep nach { Ich weiß auch nie, ob da ein \ vor muß oder nicht, da sich grep, sed, vi, perl und was es sonst noch so gibt in diesem Punkt
Hmm, im meinen RegExp Buch v. Oreilly steht, daß die "{}" einen expliziten Bereich mit einem "min" und "max" Wert benötigen.
Wie geschrieben, die RegExp sind nicht einheitlich. Es ist ein Unterschied, ob Du grep oder sed, vi oder perl hast -- Leider.
ACK! Die von Perl finde ich am besten, sonst ist egrep mein Werkzeug.
Aber das mit dem min 60 Zeichen stimmt so nicht. Es wird nach exakt 60 Zeichen gesucht, allerdings wenn da nichts davor und nichts danach steht, so wird natürlich auch mehr als 60 Zeichen gefunden, weil in mehr als 60 Zeichen auch eine Zeichenkette gibt, die aus exakt 60 Zeichen besteht. Hat man z.B
egrep "1[a-zA-Z]{60}2"
so wird eine Zeichenkette gefunden, die mit einer 1 beginnt, dan _exakt_ 60 Buchstaben hat und dann noch eine 2. Eine Zeichenkette die aus einer 1, 61 Buchstaben und eine 2 besteht wird hingegen nicht gefunden.
Ich habe gestern abend die RegExp an meiner Mailbox ausprobiert, man kann sich leicht mit den RegExp "verzetteln". grep -E '[^a-zA-Z]{10}' schmeißt mir jede Zeile aus, sobald auch nur eine Ziffer da steht.
Nicht nötig heißt immer auch falsch. Es können nicht beide Varianten gehen. Wenn \{60\} geht, dann geht mit Sicherheit {60} nicht, und umgekehrt. Es kann nur sein, daß beide Varianten nicht gehen. Es kann aber nicht sein, daß beide Varianten gehen, denn es muß auch die Möglichkeit bestehen, daß man nach der Zeichenkette {60} sucht.
Ich habe heut' Nacht mal etwas mit dem regulären Ausdruck experimentiert. Bei grep nutzt man ja die backslashes, bei grep -E nicht. Ist auch etwas merkwürdig;) Vielleicht nutzen die beiden eine andere Maschine...
Hier gilt: Probieren geht vor Studieren. Kluge Bücher sind schön und nett, aber die Praxis mag anders sein.
Jo, gerade RegExp sind öftermal ein Buch mit sieben SIegeln. Obwohl, ohne die Dinger wäre das Leben nur halb so schön;) Man braucht sie immer wieder ... Ciao Andre
* Andre Heine schrieb am 24.Dez.2001:
Am Montag, 24. Dezember 2001 08:02 schrieb Bernd Brodesser:
* Andre Heine schrieb am 23.Dez.2001:
Am Sonntag, 23. Dezember 2001 18:32 schrieb Bernd Brodesser:
grep "[a-z,A-Z]{60}" Datei.txt
Ich habe gestern abend die RegExp an meiner Mailbox ausprobiert, man kann sich leicht mit den RegExp "verzetteln".
grep -E '[^a-zA-Z]{10}' schmeißt mir jede Zeile aus, sobald auch nur eine Ziffer da steht.
Du suchst nach eine Zeichenkette, die aus 10 Zeichen besteht, welche alle _keine_ Buchstaben sind. Da sind Ziffern kein schlechter Kandidat.
Jo, gerade RegExp sind öftermal ein Buch mit sieben SIegeln. Obwohl, ohne die Dinger wäre das Leben nur halb so schön;) Man braucht sie immer wieder ...
Soll ich mal ein Geheimnis erzählen? Die RegExp sind gar keine Reguläre Ausdrücke mehr, da es sowas wie \1 und \2 usw. gibt. Man könnte z.B nach ([a-z]*)\1 suchen. Kann auch sein, daß vor den ( und ) ein \ muß, aber das ist egal. Wichtig, es ist nicht kontexfrei, sondern kontexsensitiv. Reguläre Ausdrücke sind aber kontexfreie Ausdrücke. Bernd -- Umsteiger von Microsoft Windows xx? Hast Du schon file://usr/doc/howto/de/DE-DOS-nach-Linux-HOWTO.txt gelesen? Auch file://usr/doc/Books/Linuxhandbuch.dvi ist zu empfehlen. |Zufallssignatur 1
Hallo Bernd, Am Montag, 24. Dezember 2001 17:20 schrieb Bernd Brodesser:
grep -E '[^a-zA-Z]{10}' schmeißt mir jede Zeile aus, sobald auch nur eine Ziffer da steht.
Du suchst nach eine Zeichenkette, die aus 10 Zeichen besteht, welche alle _keine_ Buchstaben sind. Da sind Ziffern kein schlechter Kandidat.
Ja, [^a-zA-Z] ist ja in den eckigen Klammern negiert. Ich habe aber angenommen, daß min 10 Zahlen oder Sonderzeichen vorkommen müssen.(nacheinander) Mir geht es nur um die "{10}" oder "{10,100}". Der {10} Ausdruck bringt schmeißt den String erst raus, wenn min. 10 Treffer gefunden werden. Bei {10,11} schmeißt mir grep -E (o. egrep) auch Strings mit 12 (odermehr) Treffern raus. IMHO soll das so nicht sein. *???*
Soll ich mal ein Geheimnis erzählen? Die RegExp sind gar keine Reguläre Ausdrücke mehr, da es sowas wie \1 und \2 usw. gibt.
Man könnte z.B nach ([a-z]*)\1 suchen. Kann auch sein, daß vor den ( und ) ein \ muß, aber das ist egal. Wichtig, es ist nicht kontexfrei, sondern kontexsensitiv. Reguläre Ausdrücke sind aber kontexfreie Ausdrücke.
Man lernt ja immer wieder etwas dazu. Wußte ich nicht. Mir sagt "kontextfrei und kontexsensitiv" nichts, was ist das? Übrigens, das Geheimnis ist keines mehr;)) ByE Andre
Hallo Andre, * Andre Heine schrieb am 24.Dez.2001:
Am Montag, 24. Dezember 2001 17:20 schrieb Bernd Brodesser:
Ja, [^a-zA-Z] ist ja in den eckigen Klammern negiert. Ich habe aber angenommen, daß min 10 Zahlen oder Sonderzeichen vorkommen müssen.(nacheinander)
Mir geht es nur um die "{10}" oder "{10,100}". Der {10} Ausdruck bringt schmeißt den String erst raus, wenn min. 10 Treffer gefunden werden. Bei {10,11} schmeißt mir grep -E (o. egrep) auch Strings mit 12 (odermehr) Treffern raus. IMHO soll das so nicht sein. *???*
Wenn Du grep bc sagst, so wird doch auch abcd gefunde, denn bc liegt in abcd. Wenn Du grep bbb sagst, dann wird auch abbbc gefunden, denn bbb liegt in abbbc, aber auch bbbb wird gefunden, denn bbb liegt in bbbb. grep b\{3\} ist aber das gleiche wie grep bbb und somit wird auch mit grep b\{3\} bbbb gefunden. grep b\{3,5\} ist das gleiche wie grep bbb|bbbb|bbbbb und es wird auch bbbbbb gefunden, da bbb in bbbbbb liegt. grep [b]\{3,\5} ist das gleiche wie grep b\{3,5\} und auch damit wird bbbbbb gefunden. Genauso verhälte es sich mit grep [a-z]\{10,100\} es wird auch ein 101 Buchstaben großes Wort gefunden, weil schon eine Zeichenfolge mit 10 Buchstaben darin steckt. Was Du willst ist sowas: grep [^a-z][a-z]\{10,100\}[^a-z] dann klappt es auch mit dem Nachbar. ;) Dann wird ein Wort aus 101 Buchstaben nicht mehr gefunden, weil nur nach eine Zeichenkette gesucht wird, die aus einem Nicht-Kleinbuchstaben gefolgt von einer zehn bis hundert Zeichen lange Zeichenkette aus Kleinbuchstabe gefolgt von einem Nicht-Kleinbuchtabe gesucht wird. Wenn Du einfach nach einer Zeichenkette aus zehn bis hundert Kleinbuchstaben suchst, so findest Du die natürlich auch in eine zweihundert Buchstaben großen Zeichenkette. Obiges grep funktioniert allerdings nicht, wenn die zehn bis hundert Zeichen direkt am Anfang oder Ende steht, für diesen Fall brauchst Du noch sowas wie ^ und $.
Soll ich mal ein Geheimnis erzählen? Die RegExp sind gar keine Reguläre Ausdrücke mehr, da es sowas wie \1 und \2 usw. gibt.
Man könnte z.B nach ([a-z]*)\1 suchen. Kann auch sein, daß vor den ( und ) ein \ muß, aber das ist egal. Wichtig, es ist nicht kontexfrei, sondern kontexsensitiv. Reguläre Ausdrücke sind aber kontexfreie Ausdrücke.
Man lernt ja immer wieder etwas dazu. Wußte ich nicht. Mir sagt "kontextfrei und kontexsensitiv" nichts, was ist das?
Das sind genau wie "Regulärer Ausdruck" Begriffe aus den Informationswissenschaften. reguläre Ausdrücke sind so definiert, daß sie kontextfrei sind, daß heißt, es kann mit einem Automaten entschieden werden, der endlich viele Zustände hat und immer nur Zeichen für Zeichen einliest, ob der Ausdruck paßt oder nicht. Hat man zB. [ab]*c[ab]* so kann man diesen Ausdruck mit einem endlichen Automaten feststellen ob eine Zeichenkette paßt. Sogar ganz einfach. Der Automat beginnt mit einem Startzustand. Wenn ein a oder b kommt, so bleibt er in diesem Zustand, kommt ein c, so wechselt er in einem anderen Zustand, kommt was anderes, so wechselt er in einem Fehlerzustand. Ist er in dem zweiten Zustand, so bleibt er in diesem Zustand, solange a oder b kommt. Kommt etwas anderes, so wechselt er wieder im Fehlerzustand. Am Ende muß er sich im zweiten Zustand befinden, damit der Ausdruck gültig ist. Es wird z.B aca oder abcab oder auch c gefunden, aber auch aabcbba Etwas anderes ist \([ab]*\)c\1 Da wird zwar auch aca, abcab und c gefunden, nicht aber aabcbba, denn das was vor dem c steht muß exakt gleich sein, wie daß was nach dem c kommt. Es ist klar, daß sowas ein endlicher Automat nicht feststellen kann, denn es gibt ja unendlich viele Kombinationen von a und b. Der Automat darf ja nicht nachschauen, er ließt nur ein einziges Zeichen, und bewertet das Aufgrund seines Zustandes, von dem es nur endlich viele gibt. Mithin ist sowas wie \([ab]*\)c\1 streng genommen kein regulärer Ausdruck. Bei Linux wird es jedoch wie ein solcher behandelt. Bernd -- Umsteiger von Microsoft Windows xx? Hast Du schon file://usr/doc/howto/de/DE-DOS-nach-Linux-HOWTO.txt gelesen? Auch file://usr/doc/Books/Linuxhandbuch.dvi ist zu empfehlen. |Zufallssignatur 1
Moin Bernd, Am Dienstag, 25. Dezember 2001 00:17 schrieb Bernd Brodesser:
Mir geht es nur um die "{10}" oder "{10,100}". Der {10} Ausdruck bringt schmeißt den String erst raus, wenn min. 10 Treffer gefunden werden. Bei {10,11} schmeißt mir grep -E (o. egrep) auch Strings mit 12 (odermehr) Treffern raus. IMHO soll das so nicht sein. *???*
Wenn Du grep bc sagst, so wird doch auch abcd gefunde, denn bc liegt in abcd. Wenn Du grep bbb sagst, dann wird auch abbbc gefunden, denn bbb liegt in abbbc, aber auch bbbb wird gefunden, denn bbb liegt in bbbb. grep b\{3\} ist aber das gleiche wie grep bbb und somit wird auch mit grep b\{3\} bbbb gefunden. grep b\{3,5\} ist das gleiche wie grep bbb|bbbb|bbbbb und es wird auch bbbbbb gefunden, da bbb in bbbbbb liegt. grep [b]\{3,\5} ist das gleiche wie grep b\{3,5\} und auch damit wird bbbbbb gefunden.
ACK, ich habe es nun raus. Man muß schon genauer eingrenzen was man suchen möchte;)
Genauso verhälte es sich mit grep [a-z]\{10,100\} es wird auch ein 101 Buchstaben großes Wort gefunden, weil schon eine Zeichenfolge mit 10 Buchstaben darin steckt. Was Du willst ist sowas:
grep [^a-z][a-z]\{10,100\}[^a-z]
Yep, der Funktioniert, wenn der String mit einer Ziffer anfängt und endet. Bei den RegExp muß man lieber mehrmals ausprobieren;) Jedenfalls sind Sie ein nettes Werkzeug... Greetings Andre
Moin Ekkard, * Ekkard Gerlach schrieb am 23 Dec 2001:
* Ekkard Gerlach (ich) schrieb:
ich will ein reguläres Muster der Häufigkeit 60 in einer Textdatei suchen:
grep "[a-z,A-Z]{60}" Datei.txt
Entweder grep "[a-z,A-Z]\{60\}" Datei.txt oder egrep "[a-z,A-Z]{60}" Datei.txt Siehe auch man grep, man 7 regex. Gruß, Sebastian -- Do not meddle in the affairs of Wizards, for they are subtle and quick to anger. Sebastian Helms - http://www.helms.sh - mailto:mail@helms.sh (PGP welcome) SuSE-Linux-Mailinglisten-FAQ: http://www.helms.sh/faq/
Moin,
* Ekkard Gerlach
grep "[a-z,A-Z]{60}" suse-liste
grep -E [a-z,A-Z]{60}" suse-liste Bist Du sicher, daß das Komma da hingehört? Thorsten -- Nobody will ever need more than 640 kB RAM. -- Bill Gates, 1983 Windows XP requires 64 MB RAM. -- Bill Gates, 2001 Nobody will ever need Windows XP. -- logical conclusion
Hallo, Am Sonntag, 23. Dezember 2001 11:37 schrieb Ekkard Gerlach:
Hallo,
ich will ein reguläres Muster der Häufigkeit 60 in einer Textdatei suchen:
grep '[a-z,A-Z]{60}'
.. aber es will nicht.
Aus man grep: {n} The preceding item is matched exactly n times
ein paar Zeilen weiter unten in der manpage von grep steht, daß das "{" und das "}" mit einem Backslash versehen sein muß, wenn man grep und nicht egrep verwendet. Also: # grep '[a-z,A-Z]\{60\}' oder # egrep '[a-z,A-Z]{60}' Mit freundlichen Grüßen Rudi -- Rudolf Elpelt EMail: elpelt@t-online.de
participants (7)
-
Andre Heine
-
B.Brodesser@t-online.de
-
Ekkard Gerlach
-
Elpelt@t-online.de
-
Peter Wiersig
-
Sebastian Helms
-
Thorsten Haude