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 : | 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
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
...
| 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. | 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:
| 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
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
|
| 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
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
|
| 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
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
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
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
|