sed -> lecker!

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
etobias
Beiträge: 15
Registriert: 15.10.2003 09:40:49

sed -> lecker!

Beitrag von etobias » 16.07.2004 12:36:51

Morgen mitander,

ich habe hier ne wirklich billige Aufgabe. Ich möchte alle
Usernamen aus der /etc/passwd ausgegeben haben ohne den
Schnulli dahinter.

So siehts z.B. aus:

Code: Alles auswählen

sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
Ergebnis soll sein:

Code: Alles auswählen

sync
games
man
lp
mail
news
uucp
proxy
So ich bin auch noch recht fröhlich am knabbern.
Mein Problem ist, das mein sed irgendwie merkwürdig reagiert. Laut eines
Tutorials sollte folgender Befehl (gib alles aus was mit alphanumerischem Zeichen beginnt):

Code: Alles auswählen

sed -n -e '/^\w/p' /etc/passwd
ja die ganze /etc/passwd ausgeben, macht er auch. Aber folgender
Befehl - auch wenn er Schwachsinn ist (Gib alles aus was alphanumerisch
oder numerisch beginnt) - sollte das gleiche tun:

Code: Alles auswählen

sed -n -e '/^(\d|\w)/p' /etc/passwd
Das macht er aber nicht, da kommt gar nix mehr raus :evil:. Das was mich irritiert ist,
dass ich die gewünschte Ausgabe erhalte wenn ich alle Sonderzeichen escape:

Code: Alles auswählen

sed -n -e '/^\(\d\|\w\)/p' /etc/passwd
Dann bringt er wieder alles. ABER ICH DENKE WENN ICH ESCAPE DANN
SUCHT ER GENAU DAS SONDERZEICHEN und interpretiert es nicht mehr als STEUERZEICHEN.

Also Grundsatzfrage:

Was bedeutet jetzt ODER?
Das hier: oder das hier In allen Tutorials wird vom ersten gesprochen, was für mich auch logisch klingt.
Kann ich sed mittels Parameter das irgendwie beibringen? So komm ich irgendwie
gar nicht weiter.

Sorry für das lange Elend.

etobias
Beiträge: 15
Registriert: 15.10.2003 09:40:49

Beitrag von etobias » 16.07.2004 13:04:09

Habs endlich rausgefunden! Wer soll den bitte wissen, dass SED hier die
Extrawurst brät?

Der Code um alle Usernamen aus der /etc/passwd zu bekommen lautet:

Code: Alles auswählen

sed -e 's/:.*//g' /etc/passwd
Für alle mit ähnlichen Problemen hier mal ein kleiner Textauszug ->
sed und REs

sed verwendet Basic Regular Expressions, eine Art Untermenge der oben vorgestellten Extended Regular Expressions. Einige Unterschiede sind:

- Die Quantifikatoren "|", "+" und "?" sind normale Zeichen, und es gibt keine äquivalenten Operatoren dafür. GNU-sed kennt diese Operatoren, wenn sie durch einen vorangestellten Backslash "escaped" werden

- Die geschwungenen Klammern sind normale Zeichen, und müssen mit Backslashes "escaped" werden, werden also als "\{" und "\}" geschrieben. Das selbe gilt für runde Klammern; die Zeichen, die durch "\(" und "\)" eingeschlossen werden, können später mit "\1" usw. dereferenziert werden

- "^" ist ein normales Zeichen, wenn es nicht am Begin einer Zeile oder eines Klammerausdrucks steht

- "$" ist ein normales Zeichen, wenn es nicht am Ende einer Zeile oder eines Klammerausdrucks steht

- "*" ist ein normales Zeichen am Begin einer Zeile oder eines Klammerausdrucks

ernohl
Beiträge: 1248
Registriert: 04.07.2002 08:11:56
Wohnort: HL

Re: sed -> lecker!

Beitrag von ernohl » 16.07.2004 13:55:26

etobias hat geschrieben:So siehts z.B. aus:

Code: Alles auswählen

sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
Ergebnis soll sein:

Code: Alles auswählen

sync
games
man
lp
mail
news
uucp
proxy

Code: Alles auswählen

awk -F: '{print $1}' /etc/passwd
Gruß
ernohl

etobias
Beiträge: 15
Registriert: 15.10.2003 09:40:49

Beitrag von etobias » 16.07.2004 14:11:58

Is auch Möglichkeit, mir gings halt eher um die Problematik
das sich sed nen bissl anders verhält als erwartet.

Trotzdem thx!

Antworten