nudrun
Anmeldungsdatum: 1. Mai 2017
Beiträge: Zähle...
|
Hi!
Ich arbeite momentan an einem sich selbst mithilfe einer Website ajtualisierendem Skript. Die für mich wichtigen Daten vefinden sich in einem Absatz, der allerdings eine Größe ändert. Daher arbeite ich mit grep und Variablen. Sed scheint allerdings nicht so zu arbeiten, wie ich mir das vorstelle. Hier ist der relevante Teil meines Skripts:
sed -i '1,120d' d.txt
a=$(grep -n backback d.txt | cut -c 1-2) #bis hierhin funktioniert alles
sed -i "$a,$d" d.txt #In unzähligen Varianten erfolglos probiert
b=$(sed -n '$=' d.txt)
sed -i "$a,$bd" #funktioniert selbstverständlich auch nicht, aber zum Maskieren scheine ich zu inkompetent zu sein
Ich habe heute bereits drei Stunden erfolglos recherchiert. In einem anderen Forum wurde meine Frage bereits gestellt, aber dort wurde auf awk und Perl verwiesen, mit denen ich nichts anfangen kann.
Danke für alle hilfreichen Antworten.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Hi nudrun, zuerst mal herzlich willkommen hier auf dem Forum ! nudrun schrieb: sed -i "$a,$d" d.txt #In unzähligen Varianten erfolglos probiert
Was sollte das denn eigentlich machen ? - - denn hier definierst Du zwar einen Zeilenbereich (durch die variablen), aber Du machst rein gar nichts in diesem Bereich ! Ich vermute mal, da hast Du was vergessen ... LG, track
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7651
|
Meinst du vielleicht "$a","$b"d ? Ansonsten wird nach einer Variable $bd gesucht. Es kommt dann noch drauf an was eigentlich in den Variablen steht. Schreib echo vor den Befehl oder mach set -x dann siehst du was eigentlich ausgeführt wird und dann ist vielleicht auch klar warum es nicht hinhauen kann. Oder vielleicht meinst du auch sowas wie sed -n /<article/,/<\/article/p Mit -n die allgemeine Ausgabe unterdrücken und mit p dann nur den gewünschten Bereich tatsächlich ausgeben, so kann man (manchmal) einen Artikel oder Absatz gezielt aus einer HTML-Seite herausziehen. Eigentlich bräuchte man hier einen HTML-Parser... bei sed kommt eben auch drauf an wie das HTML formatiert worden ist.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
frostschutz schrieb: Meinst du vielleicht "$a","$b"d ? Ansonsten wird nach einer Variable $bd gesucht. Es kommt dann noch drauf an was eigentlich in den Variablen steht.
Das glaube ich nicht: track@track:~$ a=3
track@track:~$ b=6
track@track:~$ printf %s\\n {1..9} | sed "$a,$b"d
1
2
7
8
9
Und ja: ich würde solch eine Aufgabe wahrscheinlich auch lieber in einem sed - Aufruf (mit mehreren Befehlen drin) erledigen. Aber dazu muss der TS erstmal verraten, was er genau an Daten hat und damit will. (und ich vermute auch eher, HTML spielt hier keine Rolle) LG, track
|
nudrun
(Themenstarter)
Anmeldungsdatum: 1. Mai 2017
Beiträge: 4
|
Aber dazu muss der TS erstmal verraten, was er genau an Daten hat und damit will. (und ich vermute auch eher, HTML spielt hier keine Rolle)
Das ist richtig. Ich bekomme meine Daten über lynx -dump www.keine.de/ahnung > d.txt , die hierbei auch mehr oder weniger formatiert werden. Aber wie das nun einmal bei Websites ist, steht da mehr als unbedingt nötig (Menü, Impressum, Werbeskripte...). Vor meinen Daten kommt zuerst einmal ein Menü. Da ich davon ausgehe, dass sich dessen Länge in den nächsten Jahren nicht ändert, habe ich es mit sed -i '1,120d' d.txt abgetrennt. Nun kommt mein Problem: Die Datenmenge verändert sich. Da aber Lynx kein allzu guter Konverter ist, steht glücklicherweise das Wort "backback" am Ende der Daten. Nun suche ich also mit grep nach der Zeilennummer des Wortes "backback", und da grep -n backback d.txt mehr als nur die Zeilennummer ausgibt und diese nie größer als 99 sein kann, schneide ich einfach das Zitat mit cut -c 1-2 weg. a ist also eine Zeilennummer.
Die erste Variante ist einem Skript aus dem Internet entlehnt, hierbei soll "$d" keine Variable, sondern die Anweisung, das Ende zu löschen, sein.
In der zweiten habe ich eine zum Verständnis wichtige Zeile vergessen, korrekt müsste es b=$(sed -n '$=' d.txt)
sed '$a,$bd' d.txt lauten. Natürlich kann das nicht funktionieren, wie soll das arme sed daraus den Variablennamen erkennen können.
Das Problem habe ich nun zwar unelegant mit einer While-Loop gelöst, die die a-te Zeile so lange löscht, bis es keine a-te Zeile mehr gibt, aber mein Ehrgeiz sagt mir, dass ich das nur mit sed lösen soll, daher werde ich eure Vorschläge morgen testen.
Vielen Dank für die schnellen Antworten!
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Ah, also doch eine (X)HTML- Seite ! - da hatte frostschutz also Recht. Wenn Du bei einer Webseite alle präzisen Informationen zuerst wegschneidest, um sie dann anhand irgendwelcher windigen Eigenschaften wieder zu rekonstruieren, dann hast Du natürlich nicht nur riesig viel Arbeit, sondern obendrein auch ein denkbar mäßiges Ergebnis. Wie frostschutz sagt: für ein sauberes Ergebnis brauchst Du einen sauberen Parser. In dem Sinne hatte ich hier schon einmal ein vergleichbares Ding gebastelt, das bei mir seitdem den Spritpreis mitloggt. - das könntest Du ja mal als Anregung nehmen, wenn Du uns Deine Original-URL nicht verraten magst. Auf jeden Fall gehe ich dort an die Web-Seite nicht direkt mit sed , sondern zuerst mal mit einem HTML-Werkzeug heran. Und das ist praktisch immer der sinnvollste Weg, weil man dann die HTML-Meta-Informationen nutzen kann. Ein Sortiment, wie das praktisch noch aussehen kann, findest Du in diesen Beispielen. LG, track
|
nudrun
(Themenstarter)
Anmeldungsdatum: 1. Mai 2017
Beiträge: 4
|
Mein Großvater hätte gerne ein Smartphone, um damit besser die Bundesliga verfolgen zu können, lässt sich aber regelmäßig darüber aus, dass diese Teile überteuerter Japanschrott seien. Daher möchte ich ihm ein Gerät, das genau diese Funktion übernehmen kann, aber nicht so teuer ist, schenken (Wahrscheinlich ein C.H.I.P oder, sollte der Lieferengpass weiter andauern, ein Orange Pi, mit einem LCD-Display, ein paar Knöpfen und vielleicht einem Piezo-Speaker). Darauf soll ein Programm laufen, das laufend über das Display den aktuellen Spielstand anzeigt und die Ergebnisse der letzten Spiele kennt. Dieses Programm existiert allerdings noch nicht, sodass ich mich ans, für einen Linuxanfänger, Quartalsprojekt gemacht habe, ein solches zu entwickeln. Dieses enthält ein Datenausleseskript (daran arbeiten wir momentan), eine Library (so hieße es unter Arduino) für das Display (da ich keine Ahnung habe, ob es so etwas unter WiringPi gibt, selbst mithilfe eines Microcontroller.net-Wikiartikels geschrieben und fast fertig gestellt - Das dürfte das komplizierteste gewesen sein), dem eigentlichen GPIO-Programm (da ich so etwas bereits gemacht habe, recht einfach) und einem Datenaufbereitungsskript für das Display (dürfte auch nicht so schwer sein). Was ich jetzt wie worin einbette, weiß ich noch nicht. Bitte gebt mir hierzu keine Tipps, ich möchte so viel Eigenleistung wie möglich in meinem Programm stecken haben.
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7651
|
Klingt anspruchsvoll, und ein wenig komisch wenn man dann am Quoting von Variablen hängen bleibt. :-] Viel Erfolg. (Wird aber sicher teurer als ein Smartphone. Selbst wenn man den Arbeitsaufwand nicht mit reinrechnet.)
|
nudrun
(Themenstarter)
Anmeldungsdatum: 1. Mai 2017
Beiträge: 4
|
track schrieb: Ah, also doch eine (X)HTML- Seite ! - da hatte frostschutz also Recht. Wenn Du bei einer Webseite alle präzisen Informationen zuerst wegschneidest, um sie dann anhand irgendwelcher windigen Eigenschaften wieder zu rekonstruieren, dann hast Du natürlich nicht nur riesig viel Arbeit, sondern obendrein auch ein denkbar mäßiges Ergebnis. Wie frostschutz sagt: für ein sauberes Ergebnis brauchst Du einen sauberen Parser. In dem Sinne hatte ich hier schon einmal ein vergleichbares Ding gebastelt, das bei mir seitdem den Spritpreis mitloggt. - das könntest Du ja mal als Anregung nehmen, wenn Du uns Deine Original-URL nicht verraten magst. Auf jeden Fall gehe ich dort an die Web-Seite nicht direkt mit sed , sondern zuerst mal mit einem HTML-Werkzeug heran. Und das ist praktisch immer der sinnvollste Weg, weil man dann die HTML-Meta-Informationen nutzen kann. Ein Sortiment, wie das praktisch noch aussehen kann, findest Du in diesen Beispielen. LG, track
So schlecht, wie ich ihn dargestellt habe, ist Lynx garnicht. Er gibt schon einen recht anzeigegetreuen Text (keine HTML-Datei) aus. Nur stehen da halt ein paar Sachen drin, die da nicht unbedingt hingehören. Rekonstruieren muss ich da eigentlich nichts. Da stehen keine Tags mehr drin! Ich möchte nun, wie gesagt, einfach ein großes Stück vom Anfang und das Ende entfernen.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
nudrun schrieb: So schlecht, wie ich ihn dargestellt habe, ist Lynx garnicht.
Glaube ich Dir sofort. - schließlich habe ich den auch schon öfters ausprobiert. Wenn Du den Link mit meinen Beispielen durchguckst, wirst Du diverse Beispiele finden, wo ich tatsächlich einen Textbrowser (allerdings meist w3m ) als Vor-Prozessor benutze. - Wie gesagt: es hängt sehr von der betreffenden Seite ab, ob das was bringt. Verrat uns doch mal die Seite die Du anpeilst. - Evt. kann ich Dir dann konkretere Hinweise geben. LG, track
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
nudrun schrieb:
So schlecht, wie ich ihn dargestellt habe, ist Lynx garnicht. Er gibt schon einen recht anzeigegetreuen Text (keine HTML-Datei) aus.
Wie track bereits schrieb: es ist besser die Daten direkt aus dem HTML zu extrahieren und dafür passende Werkzeuge (z.B. hxextract) zu verwenden, als erst die Strukturen wegzuschneiden und dann zu versuchen, relevante Teile zu extrahieren. Das ist extrem schwer und fehleranfällig.
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Webseiten parsen ist fast immer Sackgang, denn spätestens wenn jemand was an der Struktur ändert (die meist vorher schon ungünstig ist), funktioniert das Skript nicht mehr. Besser wäre direkt ein API zu verwenden. OpenLigaDB ist sowas, da bekommt man die Daten schön als JSON, und kann damit schmerzfrei weiterarbeiten. Die Daten werden allerdings von der Community gestellt, wenn man offizielle Zahlen haben will, muss man dafür bezahlen.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Naja, das ist ein frommer Wunsch, dass sich die Webseite ändert, aber die Auswahl mittels Parser hinterher unverändert funktioniert. | sed "$a,$d" foo
sed "$a,$b d" foo
|
Die Fehler waren doch einfach, dass gemeint war
| sed "$a,$ d" foo
sed "$a,$b d" foo
|
Also von Zeile a bis Dateiende, bzw. von Zeile a bis b, nicht bis Variable d oder bd. Das ist doch schneller korrigiert als man apt-get sagen kann.
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
user_unknown schrieb: Naja, das ist ein frommer Wunsch, dass sich die Webseite ändert, aber die Auswahl mittels Parser hinterher unverändert funktioniert.
Das mag stimmen, dennoch kann man sich IMHO eher auf einen Klassenname für ein Element als auf eine Zeilennummer verlassen, da sich letztere auch ändern kann, wenn sich die eigentliche Struktur gar nicht ändert.
|