nur Teile einer Zeile ausgeben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

nur Teile einer Zeile ausgeben

Beitrag von Maui Muc » 03.11.2005 13:42:01

Hallo,

ich habe hier ein kleines Problem, an dem ich nicht weiter komme.

Ich möchte mir aus einer Datei eine Zeichenkette der Form SID=....." ausgeben lassen. Die Zeichenkette beginnt immer mit SID= und enden mit " bei variabler Länge. Wenn ich mit grep SID=*" datei.txt in der Datei suche, wird mir die ganze Zeile ausgegeben in den das Muster gefunden wurde.

Ich will jedoch nur den Teil zwischen SID= und ". Das " signalisiert das Ende der Kette, SID= den Anfang.

Wie kann ich das am Besten nur mit der bash umsetzen?

zaarkov
Beiträge: 123
Registriert: 14.08.2003 11:08:51

Beitrag von zaarkov » 03.11.2005 14:33:42

pipe das nach dem grep einfach noch durch sed:

Code: Alles auswählen

|sed 's/SID=\(.*\)"/\1/'
zaarkov

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 03.11.2005 15:09:31

hallo zaarkov,

besten Danke, aber leide passt es noch nicht ganz.

Ich verstehe die Syntax ganz und gar nicht. Habe mich auch schon versucht einzulesen aber diese RE's sind ein Buch mit sieben Siegeln für mich.

Der Ausdruck nach dem sed bewirkt, dass vor dem, zu letzt in der Kette auftretenden, " abgeschnitten wird. Ich will allerdigs, dass vor dem ersten nach SID= auftretenden " der Rest abgeschnitten. Denn im meinem Fall kommen da noch ein paar ".

zaarkov
Beiträge: 123
Registriert: 14.08.2003 11:08:51

Beitrag von zaarkov » 03.11.2005 15:16:21

entweder

Code: Alles auswählen

man sed
,
oder gib' ein paar beispiele an und wie das ergebnis aussehen soll.
versuche dabei moeglichst viele faelle abzudecken, denn ich weiss nicht so genau, was du jetzt meinst.

zaarkov

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 03.11.2005 15:29:36

ja, das war wohl etwas konfus beschrieben von mir.

Als meine Datei sieht wie folgt aus:

Code: Alles auswählen

beiliebiger Text.....
.....
.......SID=[das ist für mich interessant]"......
..leider ist hier noch ein "...
belibiger Text ... 
Wenn im Argument von sed vor SID= ein .* setze, wirft er alles vor SID= weg. Jetzt habe ich aber das Problem, dass das " hinter dem [das ist für mich interessant] nicht das letzte im Text ist. Also sieht das Ergebins für

Code: Alles auswählen

sed 's/.*SID=\(.*\)"/\1/'
leider so

Code: Alles auswählen

[das ist für mich interessant]"......
..leider ist hier noch ein 
aus.

zaarkov
Beiträge: 123
Registriert: 14.08.2003 11:08:51

Beitrag von zaarkov » 03.11.2005 15:56:57

sed und grep arbeiten ja eh zeilenweise.
hab' dein beispiel mal in test.txt gepackt und dann

Code: Alles auswählen

 cat test.txt |grep "SID=.*\"" |sed 's/.*SID=\(.*\)".*/\1/'
gemacht. da kommt tatsaechlich [das ist für mich interessant] raus
zaarkov

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 03.11.2005 16:32:02

Code: Alles auswählen

beiliebiger Text.....
.....
.......SID=[das ist für mich interessant]"........leider ist hier noch ein " in dieser Zeile...
...
belibiger Text ... 
Ja, weil ich doof bin. Der Punkt ist, dass in der gleichen Zeile mehrer " stehen.

Dann klappt es nämlich nicht.

zaarkov
Beiträge: 123
Registriert: 14.08.2003 11:08:51

Beitrag von zaarkov » 03.11.2005 16:56:05

sed versucht natuerlich bei dem wildcard .* (beliebiges zeichen beliebig oft) natuerlich den groesstmoeglichen match zu machen.

daher waere es gut, noch etwas ueber die interessanten daten zu wissen.
z.b. nur zahlen, oder nur text, oder was koennen die punkte alles sein.

ansonsten, wenn man davon ausgeht, dass nur einmal SID... pro zeile vorkommt, koennte man diesen zwei-geteilten ansatz verwenden:

Code: Alles auswählen

cat test.txt |grep "SID=.*\"" |sed 's/^.*SID=//' |sed 's/".*$//'
zaarkov

fuzzy
Beiträge: 1021
Registriert: 04.10.2003 12:15:52

Beitrag von fuzzy » 03.11.2005 17:38:52

Hallo Maul Muc,
sofern es wirklich diese eckigen Klammern gibt, sollte diese "zu Fuß"-Lösung gehen :wink:

Code: Alles auswählen

fuzzy@sid:/tmp$ cat test.txt 
beiliebiger Text.....
.....
.......SID=[das ist für mich interessant]"........leider ist hier noch ein " in dieser Zeile...
...
belibiger Text ... 

fuzzy@sid:/tmp$ sed '/SID/!d; s/.*SID/SID/; s/].*/]/' test.txt 
SID=[das ist für mich interessant]
Gruß fuzzy

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 03.11.2005 21:25:16

nein, die [...] gibt es leider nicht, das macht man angeblich so, wenn man selbst etwas einfügt.

Aber der Code von zaarkov funktioniert.

Vielen herzlichen Dank für euer Hilfe.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 04.11.2005 00:03:51

Maui Muc hat geschrieben:

Code: Alles auswählen

sed 's/.*SID=\(.*\)"/\1/'
Du willst, dass alles außer einem " gemachted wird, also:

Code: Alles auswählen

sed 's/.*SID=\([^"]*\).*/\1/'
Das letzte .* dient dazu, auch den Rest der Zeile wegzuschneiden.

puma_rsch
Beiträge: 29
Registriert: 28.10.2005 16:27:23

Beitrag von puma_rsch » 04.11.2005 00:35:06

joa und wozu das ganze erst noch mit cat und grep belasten?

geht auch alles in einem

Code: Alles auswählen

sed -n 's/.*SID=\([^"]*\).*/\1/p' test.txt
und schon sinds 2 Prozesse weniger. Sonst verteilt bloß wieder wer "useless use of cat awards"

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 05.11.2005 12:05:34

danke puma_rsch,

das sieht hübsch aus. Leider verstehe ich diesen Ausdruck erst recht nicht mehr.

Was bewirken die (), die \ und \1?

Wie muss ich ' escapen, wenn ich anstelle von " ein # haben möchte?

An dieser Stelle schon mal viele Dank, ihr habt mir wirklich sehr geholfen.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 05.11.2005 13:47:52

Maui Muc hat geschrieben:Was bewirken die (), die \ und \1?
Die \( und \) sind Grouping Zeichen. Alles, was darin gematcht wird, wird in \1, bei der zweiten Gruppe in \2, etc. gespeichert. Beispiel: \([^x*]\) matcht bei "halloxwelt" auf "hallo", \1 enthält in diesem Falle also "hallo".
Wie muss ich ' escapen, wenn ich anstelle von " ein # haben möchte?
Wo, wie was? Wenn du alles bis zu einem # matchen willst, machst du [^#]*

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 05.11.2005 14:40:43

Wo, wie was? Wenn du alles bis zu einem # matchen willst, machst du [^#]*
äh ja, bevor ich meine Fragen stelle sollte ich sie immer noch mal gründlich lesen.

Ich will ein ' escapen und keine #.

Sorry für den Blödsinn.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 05.11.2005 16:36:18

Machst du mit Backslash: \'.

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 05.11.2005 23:49:23

Danke, es klapp wunderbar.

Alternatives Workaround, das ich gefunden habe:
die Hochkomma im Argument von sed durch Anführungszeichen ersetzen. So verarbeitet sed ein Hochkomma wie ein normales Zeichen.

Antworten