nur Teile einer Zeile ausgeben
nur Teile einer Zeile ausgeben
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?
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?
pipe das nach dem grep einfach noch durch sed:
zaarkov
Code: Alles auswählen
|sed 's/SID=\(.*\)"/\1/'
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 ".
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 ".
entweder ,
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
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
ja, das war wohl etwas konfus beschrieben von mir.
Als meine Datei sieht wie folgt aus:
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
leider so
aus.
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 ...
Code: Alles auswählen
sed 's/.*SID=\(.*\)"/\1/'
Code: Alles auswählen
[das ist für mich interessant]"......
..leider ist hier noch ein
sed und grep arbeiten ja eh zeilenweise.
hab' dein beispiel mal in test.txt gepackt und dann
gemacht. da kommt tatsaechlich [das ist für mich interessant] raus
zaarkov
hab' dein beispiel mal in test.txt gepackt und dann
Code: Alles auswählen
cat test.txt |grep "SID=.*\"" |sed 's/.*SID=\(.*\)".*/\1/'
zaarkov
Code: Alles auswählen
beiliebiger Text.....
.....
.......SID=[das ist für mich interessant]"........leider ist hier noch ein " in dieser Zeile...
...
belibiger Text ...
Dann klappt es nämlich nicht.
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:
zaarkov
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/".*$//'
Hallo Maul Muc,
sofern es wirklich diese eckigen Klammern gibt, sollte diese "zu Fuß"-Lösung gehen
Gruß fuzzy
sofern es wirklich diese eckigen Klammern gibt, sollte diese "zu Fuß"-Lösung gehen
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]
Du willst, dass alles außer einem " gemachted wird, also:Maui Muc hat geschrieben:Code: Alles auswählen
sed 's/.*SID=\(.*\)"/\1/'
Code: Alles auswählen
sed 's/.*SID=\([^"]*\).*/\1/'
joa und wozu das ganze erst noch mit cat und grep belasten?
geht auch alles in einem
und schon sinds 2 Prozesse weniger. Sonst verteilt bloß wieder wer "useless use of cat awards"
geht auch alles in einem
Code: Alles auswählen
sed -n 's/.*SID=\([^"]*\).*/\1/p' test.txt
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".Maui Muc hat geschrieben:Was bewirken die (), die \ und \1?
Wo, wie was? Wenn du alles bis zu einem # matchen willst, machst du [^#]*Wie muss ich ' escapen, wenn ich anstelle von " ein # haben möchte?