[gelöst] Mit grep xStellige Nummern finden

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
fragenfrager
Beiträge: 658
Registriert: 31.12.2003 08:47:15

[gelöst] Mit grep xStellige Nummern finden

Beitrag von fragenfrager » 25.02.2014 22:21:24

Stehe auf dem Schlauch, sollte

Code: Alles auswählen

grep '^[0-9]\{3,6\}'
oder

Code: Alles auswählen

egrep '^[0-9]{3,6}'
nicht alle Zeilen ausgeben die Ziffern am Zeilenanfang enthalten die 3 bis 6 Stellen lang sind?
Hier gibt es auch sowas aus:

Code: Alles auswählen

11111111111Hier noch Text hinten dran
Zuletzt geändert von fragenfrager am 26.02.2014 22:20:06, insgesamt 1-mal geändert.

Benutzeravatar
hikaru
Moderator
Beiträge: 13909
Registriert: 09.04.2008 12:48:59

Re: Mit grep xStellige Nummern finden

Beitrag von hikaru » 25.02.2014 22:38:03

Dir fehlt ein Dollar:

Code: Alles auswählen

grep '^[0-9]\{3,6\}$'
egrep '^[0-9]{3,6}$'
oder ein -o:

Code: Alles auswählen

grep -o '^[0-9]\{3,6\}'
egrep -o '^[0-9]{3,6}'
Je nachdem, was dein Ziel ist.

Benutzeravatar
fragenfrager
Beiträge: 658
Registriert: 31.12.2003 08:47:15

Re: Mit grep xStellige Nummern finden

Beitrag von fragenfrager » 25.02.2014 22:53:04

Habs noch nicht behirnt.
$ ist ja das Zeilenende, okay.
-o Gibt die Zeile mit dem Text auch aus, aber beschnitten auf den Treffer.
Fühlt sich noch nicht richtig an...
Wie schaffe ich es nur Zeilen auszugeben die Ziffernfolgen einer bestimmten Länge, z.B. 3-6 Stellen, enthalten? Sonst nichts.

Benutzeravatar
hikaru
Moderator
Beiträge: 13909
Registriert: 09.04.2008 12:48:59

Re: Mit grep xStellige Nummern finden

Beitrag von hikaru » 25.02.2014 23:11:59

fragenfrager hat geschrieben:Wie schaffe ich es nur Zeilen auszugeben die Ziffernfolgen einer bestimmten Länge, z.B. 3-6 Stellen, enthalten? Sonst nichts.
Das müssen wir noch ewas präzisieren!
Du möchtest, dass diese Zeilen matchen:

Code: Alles auswählen

123456
123
Diese aber nicht?:

Code: Alles auswählen

1234567
123xyz
ab3456
Dann solltest du damit zum Ziel kommen:

Code: Alles auswählen

grep '^[0-9]\{3,6\}$'

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Mit grep xStellige Nummern finden

Beitrag von Cae » 26.02.2014 01:06:45

Man kann das auch nochmal anders (miss-)verstehen: "gib' mir alle Zeilen, die zu Beginn Bloecke von 3 bis maximal 6 Ziffern am Stueck enthalten". Sprich, 1234567bar waere draussen, weil's sieben Ziffern sind (das "falsch"-Beispiel oben hat elf Ziffern). Die korrekte Antwort zu dieser Interpretation waere

Code: Alles auswählen

$ egrep '^[0-9]{3,6}([^0-9]|$)' <<EOF
> foo
> 1234567foo
> 1234
> 12
> 12345foo
> foo12345
> EOF
1234
12345foo
$ 
[^0-9] verhindert, dass direkt nach den gematchten Ziffernfolgen keine weitere Ziffer folgt, aber es koennte auch bereits das Zeilenende sein, daher die Alternative per (|).

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
fragenfrager
Beiträge: 658
Registriert: 31.12.2003 08:47:15

Re: Mit grep xStellige Nummern finden

Beitrag von fragenfrager » 26.02.2014 07:53:03

okay, das hatte ich versucht aber die runden Klammern fehlten mir, warum sind die notwendig? was ist an

Code: Alles auswählen

egrep '^[0-9]{3,6}[^0-9]' ZAHLEN
falsch, wenn wir mal das Zeilenende außen vor lassen?

Habe jetzt folgende Liste

Code: Alles auswählen

1
12--hier beliebige Zeichen
123--hier beliebige Zeichen
1234--hier beliebige Zeichen
12345--hier beliebige Zeichen
hier beliebige Zeichen--1--hier wieder Zeichen
hier beliebige Zeichen--12--hier wieder Zeichen
hier beliebige Zeichen--123--hier wieder Zeichen
hier beliebige Zeichen--1234--hier wieder Zeichen
hier beliebige Zeichen--12345--hier wieder Zeichen
oder eben so wie hier, da sind sie halt am zeilenende1
oder eben so wie hier, da sind sie halt am zeilenende12
oder eben so wie hier, da sind sie halt am zeilenende123
oder eben so wie hier, da sind sie halt am zeilenende1234
oder eben so wie hier, da sind sie halt am zeilenende12345
Hier möchte ich jetzt alle Zeilen ausgeben die irgendwo in der Zeile 3 bis 4 Stellige Ziffernfolgen haben.

Code: Alles auswählen

egrep '^[0-9]{3,4}([^0-9]|$)' ZAHLEN
123--hier beliebige Zeichen
1234--hier beliebige Zeichen
so weit so gut, jetzt brauch ich aber noch ein Konstrukt welches Ziffern nur am Ende der Zeile ausgibt und ein Konstrukt welches Ziffern die werder am Anfang, noch am Ende der Zeile stehen.
EDIT:
warum nur??

Code: Alles auswählen

egrep '.*[0-9]{3,4}$' ZAHLEN 
oder eben so wie hier, da sind sie halt am zeilenende123
oder eben so wie hier, da sind sie halt am zeilenende1234
oder eben so wie hier, da sind sie halt am zeilenende12345
Ein beliebiges Zeichen außer Zeilenvorschub, beliebig oft,gefolgt von einer Ziffer 3-4 Wiederholungen Am Zeilenende?! Wieso gibt er mir dann die 5 stellige aus? bisher hatte ich grep sehr gerne :|
EDIT2:
Denkfehler!

Code: Alles auswählen

egrep '.*[^0-9][0-9]{3,4}$' ZAHLEN
Jetzt fehlt mir nur noch das letzte Konstrukt für die Ziffern in der Mitte der Zeile

Benutzeravatar
hikaru
Moderator
Beiträge: 13909
Registriert: 09.04.2008 12:48:59

Re: Mit grep xStellige Nummern finden

Beitrag von hikaru » 26.02.2014 09:05:19

fragenfrager hat geschrieben:okay, das hatte ich versucht aber die runden Klammern fehlten mir, warum sind die notwendig? was ist an

Code: Alles auswählen

egrep '^[0-9]{3,6}[^0-9]' ZAHLEN
falsch, wenn wir mal das Zeilenende außen vor lassen?
Ich komme jetzt etwas ins Schwimmen, aber soweit ich weiß brauchst du die Klammern damit die Alternative greift. Andernfalls würde die Pipe als Character Interpretiert.
fragenfrager hat geschrieben:Jetzt fehlt mir nur noch das letzte Konstrukt für die Ziffern in der Mitte der Zeile
Dann brauchst du nach diesem Vorbild

Code: Alles auswählen

egrep '.*[^0-9][0-9]{3,4}$' ZAHLEN
noch ein Konstrukt, das nicht nur am Anfang sondern auch am Ende überflüssige Ziffern nicht matcht:

Code: Alles auswählen

egrep '.*[^0-9][0-9]{3,4}[^0-9]+$'
Die ganzen Sachen kann man übrigens vorne noch etwas straffen, das wäre aber reine Kosmetik:

Code: Alles auswählen

egrep '[^0-9]+[0-9]{3,4}[^0-9]+$'

Benutzeravatar
fragenfrager
Beiträge: 658
Registriert: 31.12.2003 08:47:15

Re: Mit grep xStellige Nummern finden

Beitrag von fragenfrager » 26.02.2014 22:19:20

Super, lieben Dank :hail:
Weil so schön lang ist, hier das gesamte Werk

Code: Alles auswählen

egrep '(^[0-9]{3,4}([^0-9]|$)|.*[^0-9]([0-9]{3,4}$)|[^0-9]+[0-9]{3,4}[^0-9]+$)' ZAHLEN

Antworten