ubuntuusers.de

Mehrere Werte einer Zeile auslesen

Status: Ungelöst | Ubuntu-Version: Ubuntu 13.10 (Saucy Salamander)
Antworten |

Ezak

Anmeldungsdatum:
28. Oktober 2013

Beiträge: Zähle...

Hallo zusammen, ich hoffe ihr könnt mir helfen.

Ich habe eine Datei die 1 Zeile hat, diese ist wie folgt aufgebaut:

blablubirgendeintext"title":"Wert den ich will","vote_average"blablubirgendeinanderertext"title":"Anderer Wert den ich will","vote_average"blablubirgendeinandertext...usw

Dabei ist das was fett ist immer gleich und das makierte der wert den ich will. Das ganze brauche ich für ein sh skript, leider geht kein python kein bash und auch kein perl oder sonstiges es muss sh sein.

der text steht in /tmp/filme.txt wenn ich folgendes ausführe :

1
sed -n -e 's/.*"title":"\(.*\)","vote_average".*/\1/p' /tmp/filme.txt > /tmp/neu.txt

steht in neu.txt nur der letze wert, ich brauche aber alle, kann mir da einer helfen?

Vielen Dank und viele Grüße

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Ezak schrieb:

blablubirgendeintext"title":"Wert den ich will","vote_average"blablubirgendeinanderertext"title":"Anderer Wert den ich will","vote_average"blablubirgendeinandertext...usw ...

1
sed -n -e 's/.*"title":"\(.*\)","vote_average".*/\1/p' /tmp/filme.txt > /tmp/neu.txt

steht in neu.txt nur der letze wert, ich brauche aber alle, kann mir da einer helfen?

Das Schlüsselwort ist hier "greedy" (de: gierig). Reguläre Ausdrücke sind, wenn man nicht eine explizite Regel einsetzt, die das verhindert und die sich nur Kranke Cranks und Nerds merken können - irgendwas mit ?+ oder so ähnlich.

1
2
echo 'blablubirgendeintext"title":"Wert den ich will","vote_average"blablubirgendeinanderertext"title":"Anderer Wert den ich will","vote_average"blablubirgendeinandertext' | sed -re 's/[^:]*"title":"([^:]*)","vote_average"/\1--+--/g'
Wert den ich will--+--Anderer Wert den ich will--+--blablubirgendeinandertext

Ob man mit dem Nicht-Doppelpunkt [^:] vereinfachen kann musst Du wissen.

Das sed -r bewirkt, dass man keine Maskierung bei den runden Klammern braucht. -n fliegt raus, weil wir mit s/ := "substitute" eh alles ersetzen, was wir nicht wollen. /g := global sagt, nicht nur einmal anwenden, Hauptsache ist aber, und dafür kürze ich mal die Texte:

1
echo 'aA:X,BcA:Y,Bd' | sed -rne 's/.*A:(.*),B.*/\1/p'

Das liefert Y, denn .*A matcht zum ersten A und zum zweiten. Wenn der Rest auf den längeren Ausdruck passt, dann wird der kürzere nicht versucht. Was ist der Rest?

:Y,Bd soll auf ☹.*),B.* passen und es passt.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Für sowas, wo der gesuchte Ausdruck mehrfach in einer Zeile vorkommt, schlage ich grep -o zum herauslösen des Ausdrucks vor, und dahinter ein sed, um die "Ränder" wegzuschneiden:

track@lucid:~$ echo 'blablubirgendeintext"title":"Wert den ich will","vote_average"blablubirgendeinanderertext"title":"Anderer Wert den ich will","vote_average"blablubirgendeinandertext...usw' \
  |  grep -o '"title":"[^"]*","vote_average"'  |  sed 's/.*":"//; s/",".*//'
Wert den ich will
Anderer Wert den ich will 

Für Deinen gesuchten Wert bin ich mal davon ausgegangen, dass der alles, nur keine Gänsefüßchen enthält, sonst muss man was anderes finden, was dort nicht vorkommt. (→ gegen die "Gier" des regulären Ausdrucks, wie user unknown schon vorschlug)

LG,

track

Ezak

(Themenstarter)

Anmeldungsdatum:
28. Oktober 2013

Beiträge: 7

1
2
		grep -o '"title":"[^"]*","vote_average"'  |  sed 's/.*":"//; s/",".*//' /tmp/filme.txt > /tmp/neu.txt
		cat /tmp/neumarc.txt

Scheint sich iwie aufzuhängen =( und in /tmp/neu.txt steht auch wieder nur ein wert? " werden in den Werten keine verwendet

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

n.b.: Du liest eine andere Datei aus, als Du vorher erzeugt hast ...? 😲

Ich hatte in meinem Belegbeispiel exakt Dein Beispiel verwendet, und da ging es.
Wenn es bei Deinen Daten jetzt plötzlich anders ist, müsste man mal gucken, was da anders ist ... ist womöglich ein Tag anders geschrieben ?

Sonst müsstest Du mal ein Beispiel posten mit dem es nicht mehr geht. (sonst können wir es ja nicht testen)

track

Ezak

(Themenstarter)

Anmeldungsdatum:
28. Oktober 2013

Beiträge: 7

1
2
	grep -o '"title":"[^"]*","vote_average"' /tmp/filmenow2.txt > /tmp/filmenow3.txt
	sed 's/.*":"//; s/",".*//' /tmp/filmenow3.txt > /tmp/filmenow4.txt

so gehts in 2 Zeilen und bei allen in files schreiben , vielen Dank

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Achso, das sehe ich jetzt erst: Du hattest ja dem 2. Befehl in der Pipe die Datei mitgegeben ... 😬 - das kann natürlich nicht klappen, denn dann hat der 1. Befehl ja nichts, das er in de Pipe einspeisen kann. (genau genommen nimmt der 1. Befehl dann Deine Tastatureingabe als Datenquelle ...)

Aber so herum wird ein Schuh daraus:

grep -o '"title":"[^"]*","vote_average"' /tmp/filme.txt  |  sed 's/.*":"//; s/",".*//'  >  /tmp/neu.txt

😉

LG,

track

Ezak

(Themenstarter)

Anmeldungsdatum:
28. Oktober 2013

Beiträge: 7

Ich hätte da noch eine Frage, kann ich mit sed sagen, dass nach allen 20 Zeichen eine leerzeile eingefügt wird?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ezak schrieb:

mit sed ... nach allen 20 Zeichen eine leerzeile eingefügt wird?

Ganz einfach: "ersetze 20 (beliebige) Zeichen durch sich selbst plus einen Zeilenumbruch":

sed 's/.\{20\}/&\n/g'

Die geschweiften Klammern müssen hier bei sed escaped werden, und .../g heißt "generell", also nicht nur 1x, sonder immer wieder.

Aber schau Dir doch mal das sed- Tutorium an, da ist das alles wunderschön erklärt ...!

LG,

track

Ezak

(Themenstarter)

Anmeldungsdatum:
28. Oktober 2013

Beiträge: 7

Wie kann ich das aus Post 3 in eine Variable speichern? Bei mir ist es immer leer nur wenn ich es in die txt dateien schreibe gehts

shell bringt mich noch zum verzweifeln =( vielen Dank

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ezak schrieb:

shell bringt mich noch zum verzweifeln =(

Dann solltest Du Dir vielleicht doch noch mal sorgfältig die Grundlagen draufschaffen ... 😉

Das was Du suchst, ist die Command Substitution, eventuell auch kombiniert mit einem Array.

LG,

track

Antworten |