sed: Passenden String ausgeben, anstatt ersetzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Kobe
Beiträge: 45
Registriert: 30.11.2008 23:59:01

sed: Passenden String ausgeben, anstatt ersetzen

Beitrag von Kobe » 14.01.2009 16:05:28

Hallo

Ich möchte mit sed (oder wenn ihr eine andere Möglichkeit habt, auch die) einen String beschneiden:

Code: Alles auswählen

$ echo beispiele/r0020_good_class1__nr01/output.abs | sed 's/_good.*$//' | sed 's/r....//'
beispiele/
Nun möchte ich die 0020 als Ergebnis und sie nicht rausschmeißen. Ich habe von "g" anstatt "s" (substitute) gelesen, komme aber mit der Syntax nicht klar

Code: Alles auswählen

$ echo beispiele/r0020_good_class1__nr01/output.abs | sed 's/_good.*$//' | sed 'g/r....//'
sed: -e Ausdruck #1, Zeichen 2: extra characters after command
Im String steht die Zahl, die ich möchte, immer als 4-stellige Zahl nach dem r, davor kann der Pfad auch leer sein. Da der Pfad auch leer sein kann, kann ich nicht nach "/" suchen, ein Zeichen weiter (das "r") und danach das ausgeben. Ich muss von hinten / rechts ran.

Ich hoffe ihr könnt mir helfen

mfg
Stephan

//edit
Was mir gerade auffällt: Anstatt "good" kann auch "bad" im String stehen. Am besten ich schmeiße hinten alles weg bis zum 2. "_".

//edit2
Unabhängig von gut und böse

Code: Alles auswählen

$ echo beispiele/r0020_good_class1__nr01/output.abs | sed 's/_[^_]*_class[^_]*__.*$//'
beispiele/r0020
Jetzt noch die "0020" bekommen.

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed: Passenden String ausgeben, anstatt ersetzen

Beitrag von Meillo » 14.01.2009 16:47:37

Kobe hat geschrieben: //edit2
Unabhängig von gut und böse

Code: Alles auswählen

$ echo beispiele/r0020_good_class1__nr01/output.abs | sed 's/_[^_]*_class[^_]*__.*$//'
beispiele/r0020
Jetzt noch die "0020" bekommen.
Kobe hat geschrieben: Im String steht die Zahl, die ich möchte, immer als 4-stellige Zahl nach dem r, davor kann der Pfad auch leer sein. Da der Pfad auch leer sein kann, kann ich nicht nach "/" suchen, ein Zeichen weiter (das "r") und danach das ausgeben. Ich muss von hinten / rechts ran.
Wenn da immer dieser `r' steht, dann:

Code: Alles auswählen

$ echo beispiele/r0020_good_class1__nr01/output.abs | sed 's/_[^_]*_class[^_]*__.*$// ; s/.*r//'
0020
oder, wenn das `r' wichtig ist:

Code: Alles auswählen

$ echo beispiele/r0020_good_class1__nr01/output.abs | sed 's/_[^_]*_class[^_]*__.*$// ; s/.*r/r/'
r0020
alternativ vielleicht auch:

Code: Alles auswählen

echo beispiele/r0020_good_class1__nr01/output.abs | sed 's/.*r\([0-9][0-9][0-9][0-9]\)_\(good\|bad\)_class.*/\1/'
r0020
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: sed: Passenden String ausgeben, anstatt ersetzen

Beitrag von Duff » 14.01.2009 16:48:54

Vielleicht so:

Code: Alles auswählen

daniel@daniel-laptop:~$ echo "noch_/ein_/weiteres/beispiele_a/r0020_good_class1__nr01/output.abs" | sed -ne 's/.*[A-Za-z0-9_]*[/]\{0,1\}r\([0-9]\{4\}\).*$/\1/p'
0020
daniel@daniel-laptop:~$ echo "r0020_bad_class1__nr1/output.abs" | sed -ne 's/.*[A-Za-z0-9_]*[/]\{0,1\}r\([0-9]\{4\}\).*$/\1/p'
0020
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed: Passenden String ausgeben, anstatt ersetzen

Beitrag von Meillo » 14.01.2009 16:55:19

btw:
Duff hat geschrieben:

Code: Alles auswählen

[/]\{0,1\}
das geht auch kürzer: ;-)
Use ed once in a while!

Kobe
Beiträge: 45
Registriert: 30.11.2008 23:59:01

Re: sed: Passenden String ausgeben, anstatt ersetzen

Beitrag von Kobe » 14.01.2009 17:02:18

Ich danke euch.

Ich finde (von mir erweitert)

Code: Alles auswählen

$ echo beispiele/r0020_good_class921__nr01/output.abs | sed 's/.*r\([0-9][0-9][0-9][0-9]\)_\(good\|bad\)_class\([0-9]*\)__nr\([0-9]*\).*/\1/'
0020
Optimal, da dort die komplette Syntax des Strings drin steckt (die ich euch nicht genannt habe, ich weiß) und ich kann mit \0 bis \4 jeden Substring ausgeben lassen.

Ich bin da nicht drauf gekommen, weil ich diese Stellen "\1" nicht verstehe. Wo sagen wir sed, wo die Trennzeichen sind? Er nimmt sich anscheinend die "_" bzw. "__" als Trennzeichen.

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed: Passenden String ausgeben, anstatt ersetzen

Beitrag von Meillo » 14.01.2009 17:11:40

Kobe hat geschrieben:Ich bin da nicht drauf gekommen, weil ich diese Stellen "\1" nicht verstehe. Wo sagen wir sed, wo die Trennzeichen sind? Er nimmt sich anscheinend die "_" bzw. "__" als Trennzeichen.
Nein, das sind Rückwärtsreferenzen auf die geklammertern Teile.

Du hättest die Klammern hinten weglassen können, wenn du darauf nicht verweisen willst.

Code: Alles auswählen

$ echo beispiele/r0020_good_class921__nr01/output.abs | sed 's/.*r\([0-9][0-9][0-9][0-9]\)_\(good\|bad\)_class[0-9]*__nr[0-9]*.*/\1/'
0020
Zum Begrenzen von Alternation (siehge: good/bad) und zum Zusammenfassen bei Qualifizierern (*?, hier aber so nicht verwendet) sind sie auch wichtig.
Use ed once in a while!

Kobe
Beiträge: 45
Registriert: 30.11.2008 23:59:01

Re: sed: Passenden String ausgeben, anstatt ersetzen

Beitrag von Kobe » 14.01.2009 18:25:14

Durch "\(" und "\)", ahja.

Dankeschön an euch.

PS:
Der aktuelle sed-Befehl

Code: Alles auswählen

$ echo beispiele/r0020_good_class921__nr012345/output.abs | sed 's/.*r\([0-9]\{4\}\)_\(good\|bad\)_class\([0-9]\{1,\}\)__nr\([0-9]\{1,\}\).*/\1/'
Mit "Genau 4 Zahlen nach r", mind. 1 Zahl oder mehr nach class und nr.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: sed: Passenden String ausgeben, anstatt ersetzen

Beitrag von Duff » 14.01.2009 19:22:01

Meillo hat geschrieben:btw:
Duff hat geschrieben:

Code: Alles auswählen

[/]\{0,1\}
das geht auch kürzer: ;-)
Stimmt, so würde man es auch in perl machen ;-)

Meine mich aber zu erinnern, dass es auf sun solaris oder hp-ux nicht geht. Deshalb benutze ich immer mehr diese "alte" Syntax.
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed: Passenden String ausgeben, anstatt ersetzen

Beitrag von Meillo » 14.01.2009 20:14:50

Duff hat geschrieben:
Meillo hat geschrieben:btw:
Duff hat geschrieben:

Code: Alles auswählen

[/]\{0,1\}
das geht auch kürzer: ;-)
Meine mich aber zu erinnern, dass es auf sun solaris oder hp-ux nicht geht. Deshalb benutze ich immer mehr diese "alte" Syntax.
Hmm ... danke für den Hinweis. Ich lag falsch (mit dem Fragezeichen): http://en.wikipedia.org/wiki/Regular_expression#POSIX
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: sed: Passenden String ausgeben, anstatt ersetzen

Beitrag von Duff » 14.01.2009 20:35:05

Meillo hat geschrieben:Hmm ... danke für den Hinweis. Ich lag falsch (mit dem Fragezeichen): http://en.wikipedia.org/wiki/Regular_expression#POSIX
Ja, ja. Das sind die Kleinigkeiten/Stolperfallen über die ich auch immer wieder stoße/(rein)falle ;-)
Oh, yeah!

Antworten