grep nach Muster suchen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
slu
Beiträge: 2234
Registriert: 23.02.2005 23:58:47

grep nach Muster suchen

Beitrag von slu » 19.07.2016 15:44:21

Hallo,

ich möchte in einem PDF nach einem Muster (** 12345678 **) suchen, das klappt auch soweit:

Code: Alles auswählen

pdftotext -f 1 -l 1 4.pdf - | grep [**] | cut -d ' ' -f 2
Aber irgendwie ist das nicht so sauber, wie kann ich z.B. beachten das 8 digits kommen?

Hatte schon mit sowas gespielt, aber das wirkt sobald zwei sterne kommen:

Code: Alles auswählen

pdftotext -f 1 -l 1 1.pdf - | grep -E '[**]+[**]'
Gruß
slu

Das Server Reinheitsgebot:
Debian Bookworm, sonst nichts.

Stolzer Gewinner der Jessie Release Wette:
https://wiki.debianforum.de/Jessie_Release_Wette#SIEGER

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

Re: grep nach Muster suchen

Beitrag von hikaru » 19.07.2016 15:54:18

Mir ist nicht ganz klar, was die Sterne sein sollen. Sind das die reinen Zeichen (also Shift +), sollen das Wildcards sein, wie z.B. in Shells (ls *) oder Regex-Metazeichen für eine beliebige Vervielfältigung?

tobo
Beiträge: 2339
Registriert: 10.12.2008 10:51:41

Re: grep nach Muster suchen

Beitrag von tobo » 19.07.2016 15:55:04

slu hat geschrieben:Aber irgendwie ist das nicht so sauber, wie kann ich z.B. beachten das 8 digits kommen?
Genau so, wie du das gerade aufgesagt hast:

Code: Alles auswählen

[[:digit:]]{8}
Als extended regex.

slu
Beiträge: 2234
Registriert: 23.02.2005 23:58:47

Re: grep nach Muster suchen

Beitrag von slu » 19.07.2016 16:03:36

hikaru hat geschrieben:Mir ist nicht ganz klar, was die Sterne sein sollen. Sind das die reinen Zeichen (also Shift +)
Ja Shift +

Ich brauche aber nur die reinen Zahlen.
Gruß
slu

Das Server Reinheitsgebot:
Debian Bookworm, sonst nichts.

Stolzer Gewinner der Jessie Release Wette:
https://wiki.debianforum.de/Jessie_Release_Wette#SIEGER

slu
Beiträge: 2234
Registriert: 23.02.2005 23:58:47

Re: grep nach Muster suchen

Beitrag von slu » 19.07.2016 16:05:26

tobo hat geschrieben:

Code: Alles auswählen

[[:digit:]]{8}
Als extended regex.
Da findet er zu viel, ich muss genau die acht Zahlen zwischen Zeichen '** 'ZAHLEN' **' ausgeben.
Die Sternchen dienen nur zum erkennen der Stelle.
Gruß
slu

Das Server Reinheitsgebot:
Debian Bookworm, sonst nichts.

Stolzer Gewinner der Jessie Release Wette:
https://wiki.debianforum.de/Jessie_Release_Wette#SIEGER

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

Re: grep nach Muster suchen

Beitrag von hikaru » 19.07.2016 16:44:59

Mit grep geht das nicht in einem Rutsch, denn du brauchst die Sterne einerseits um überhaupt dein Pattern zu erkennen, andererseits willst du sie nicht in der Ausgabe haben. Zweistufig ginge das z.B. so:

Code: Alles auswählen

egrep -o '\*\* [[:digit:]]{8} \*\*' DATEI | egrep -o '[[:digit:]]{8}'
Mit sed geht das in einem Schritt, denn das kann sich das tatsächlich gesuchte Pattern merken:

Code: Alles auswählen

sed -n 's/\*\* \([[:digit:]]\{8\}\) \*\*/\1/p' DATEI
...mit awk sicher auch.

slu
Beiträge: 2234
Registriert: 23.02.2005 23:58:47

Re: grep nach Muster suchen

Beitrag von slu » 19.07.2016 17:30:08

hikaru hat geschrieben:

Code: Alles auswählen

egrep -o '\*\* [[:digit:]]{8} \*\*' DATEI | egrep -o '[[:digit:]]{8}'
Das funktioniert sehr gut, vielen Dank für den Code!
hikaru hat geschrieben:

Code: Alles auswählen

sed -n 's/\*\* \([[:digit:]]\{8\}\) \*\*/\1/p' DATEI
...mit awk sicher auch.
Das funktioniert auch, allerdings auch wenn ich folgendes schreibe:

Code: Alles auswählen

sed -n 's/\*\* \([[:digit:]]\{8\}\) \*\+/\1/p' DATEI
Wir denn das + mit * gleichgesetzt?
Gruß
slu

Das Server Reinheitsgebot:
Debian Bookworm, sonst nichts.

Stolzer Gewinner der Jessie Release Wette:
https://wiki.debianforum.de/Jessie_Release_Wette#SIEGER

tobo
Beiträge: 2339
Registriert: 10.12.2008 10:51:41

Re: grep nach Muster suchen

Beitrag von tobo » 19.07.2016 17:52:01

Bei den seds sollte man vielleicht Anfang und Ende der Zeilen einschließen, wenn man nicht ausschließen kann, dass da noch was kommt!?

Code: Alles auswählen

sed -n 's/^.*\*\* \([[:digit:]]\{8\}\) \*\*.*$/\1/p'  DATEI
+ heißt 1mal oder mehr und * heißt 0mal oder mehr. Bedeutet also, relevanter Unterschied ist nur bei 0mal.
EDIT: Was natürlich meinerseits Quatsch war, da du das ja als Suchmuster betrachtest.
EDIT2: In dem Falls heißt es dann tatsächlich doch 1 oder mehrere "*", ist also doch eine Quantifizierung. Wenn Du das Zeichen + suchst, dann ohne \ angeben. Falls sed mit -r benutzt wird, dann dreht sich die Logik genau rum.

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

Re: grep nach Muster suchen

Beitrag von hikaru » 20.07.2016 09:15:35

tobo hat geschrieben:Bei den seds sollte man vielleicht Anfang und Ende der Zeilen einschließen, wenn man nicht ausschließen kann, dass da noch was kommt!?

Code: Alles auswählen

sed -n 's/^.*\*\* \([[:digit:]]\{8\}\) \*\*.*$/\1/p'  DATEI
Jein.
In slus Ausgangsfragestellung stand nicht drin, dass die gesuchten Strings allein in der Zeile stehen. Also sollte man das auch nicht beim Pattern voraussetzen. Wann immer Regex im Spiel sind, muss man bei Formulierung und Interpretation der Fragestellung sehr exakt sein.
Aber du hast natürlich recht, dass mein sed-Pattern zu simpel war um das Problem wirklich zu lösen. Ich hatte es erstellt, bevor ich erkannte, das ich in der grep-Pipe auch schon beim ersten Aufruf -o brauche.
tobo hat geschrieben:Falls sed mit -r benutzt wird, dann dreht sich die Logik genau rum.
Was sehr zur Übersichtlichkeit beitragen kann. Daher zweiter Versuch:

Code: Alles auswählen

sed -nr 's/(.*\*\* )([[:digit:]]{8})( \*\*.*)/\2/p' test.txt

tobo
Beiträge: 2339
Registriert: 10.12.2008 10:51:41

Re: grep nach Muster suchen

Beitrag von tobo » 20.07.2016 12:34:06

hikaru hat geschrieben:Jein.
In slus Ausgangsfragestellung stand nicht drin, dass die gesuchten Strings allein in der Zeile stehen. Also sollte man das auch nicht beim Pattern voraussetzen.
Verstehe ich nicht. Genau darauf bezog sich doch meine Antwort!?

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

Re: grep nach Muster suchen

Beitrag von hikaru » 20.07.2016 13:20:24

Tut mir leid, ich hatte vorhin nur die Anchors gesehen.

Antworten