eine Zeile mit definiertem Inhalt ersetzen

  • Hallo zusammen,

    es klingt vielleicht ein wenig irrsinnig, aber ich möchte es dennoch tun.

    Auf meiner Homepage soll in einer Zeile die aktuelle Temperatur von hier, also meinem Heimatort, angezeigt werden.

    Dazu habe ich am Pi einen Temperaturfühler angeschlossen, dessen Wert ich auslese.

    So alle paar Minuten.

    In der Startseite (index.htm) gibt es eine Zeile, die den Wortlaut "aktuelle Temperatur 6.6°C" hat.

    Nun soll die Zeile, die den Wortlaut "aktuelle Temperatur..." hat mit einer Zeile ersetzt werden, die die aktuelle Temperatur enthält. Dann wird die Datei via FTP zum Host-Server hochgeladen.


    Auf meiner Suche im Netz bin ich vor allen Dingen auf

    Code
    SED

    gestoßen , welches aber nach einer bestimmten Zeilennummer sucht. Um aber das Ersetzen dynamisch zu halten, ist es besser, nach dem String zu suchen, um diese Zeile zu ersetzen.

    Hier bin ich so in etwa fündig geworden:

    Suchen und Ersetzen

    doch da wird das Verzeichnis und ALLE Unterverzeichnisse durchsucht und Ersetzungen vorgenommen.

    Da sich meine komplette Homepage auf dem Raspi befindet, ist das ein Unterfangen von 1 Stunde, obwohl ja nur in einer ganz bestimmten Datei etwas ersetzt werden soll.


    Hoffe, ich habe mich so halbwegs verständlich ausgedrückt, bin im richtigen Forum und - mir kann bitte jemand helfen.


    Vielen Dank

    Thomas

  • Es gibt bessere Ansaetze, aber wenn es sein muss:


    template.html

    HTML
    <!DOCTYPE html>
    <html>
     <body>
      <h1>{{temp}}</h1>
     </body>
    </html>

    Auf der Shell:

    Code
    $ TEMP=12
    $ $ sed "s/{{temp}}/$TEMP/" template.html > index.html
  • Hallo Tell,


    vielen Dank für die rasche Antwort.


    Leider verstehe ich das nicht so ganz.

    Die Index.htm hat 164 Zeilen. In irgendeiner Zeile(!) stehen die Worte "aktuelle Temperatur". Genau diese Zeile soll ersetzt werden. Da ich nicht weiß, welche Temperatur zuletzt dort drin stand, muss also die Zeile komplett ersetzt werden, die mit diesen beiden Schlüsselwörtern beginnt: "aktuelle Temperatur".

    So wollte ich diese Datei (index.htm) selbst bearbeiten. Ohne einen Umweg über ein Template.

    Vielleicht verstehe ich das ganz nur nicht.


    Danke

    Thomas

  • Hallo Tell,


    super. Vielen Dank.


    Genauso habe ich es mir vorgestellt.

    Ich glaube, ich muss mich mit

    Code
    SED

    noch etwas genauer beschäftigen.


    Nachmals vielen Dank und einen schönen Abend noch.


    Thomas

  • Mit sed ... noch etwas genauer beschäftigen.

    Nicht nur mit sed. Das ganze Suchen und Ersetzen basiert auf regulaeren Ausdruecken deren Syntax und Semantik Du lernen und verstehen musst ;)

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Hallo Tell,


    ich noch mal.


    Nun muss ich das ganz noch in eine Shell packen, damit das auch so passiert, wenn ich nicht da bin. Hier der Code:

    Bash
    #!/bin/sh
    temp=$(cat /sys/bus/w1/devices/28-00000d5b4f4a/w1_slave | grep -i t= | cut -c30-);
    temp=$(echo "scale=2; $temp/1000" | bc -l)
    echo $temp" Grad Celsius";
    sed -i 's/^aktuelle Temperatur.*/aktuelle Temperatur .$temp. Grad/' /var/www/html/thomas/index.htm

    Wie zu sehen ist, habe ich die Variable für $temp versucht einzufügen. Aber das macht er nicht. Die Shell schreibt dann den kompletten Satz mit $temp in die index.htm.

    Habs auch schon mal so probiert, aber das ergibt eine Fehlermeldung:

    Bash
    #!/bin/sh
    temp=$(cat /sys/bus/w1/devices/28-00000d5b4f4a/w1_slave | grep -i t= | cut -c30-);
    temp=$(echo "scale=2; $temp/1000" | bc -l)
    echo $temp" Grad Celsius";
    sed -i 's/^aktuelle Temperatur.*/aktuelle Temperatur /' .$temp.'/ Grad/' /var/www/html/thomas/index.htm

    Wenn ich auf der Befehlszeile

    Code
    sed --help

    eingebe, dann bekomme ich da nur Kauderwelsch, welches mir nicht weiterhilft.

    Geht noch ein wenig Hilfe?


    Danke

    Thomas

  • Hallo hyle, hallo Tell,


    vielen Dank für die Hilfe.

    So wie hyle es beschrieb, ging es nicht :(

    Brachte diese Fehlermeldung:

    Code
    sed: -e Ausdruck #1, Zeichen 47: Unbekannte Option für »s«

    Habe es dann so gemacht, wie Tell es machen würde, und nun geht es.


    Nochmals vielen Dank.

    Thomas


    PS: Shebang wurde von sh in bash geändert :)

  • Ah ja, die einfachen Hochkommata hatte ich in Deiner Version / Tells Vorschlag übersehen. :blush:


    Btw. Meine Version aus Beitrag #6 würde übrigens auch funktionieren, wenn sich da nicht das " hat" mir reingemogelt hätte. Naja, war schon spät gestern. :shy:


    Wenn das Thema für Dich erledigt ist, dann markiere den Thread bitte noch (oben unter Thema bearbeiten) als erledigt! :danke_ATDE:

  • Maneuverkritik: Die erste Zeile ist ein typischer Fall von „useless use of cat“ weil man die Datei auch ``grep`` als Argument geben kann.


    Bei ``grep`` sollte die `-i`-Option unnötig sein. Falls der Sensor ein grosses T liefert, dann trotzdem, denn dann würde man einfach den Suchtext anpassen. Ist ja nicht so, dass der irgendwann mal zwischen Gross- und Kleinschreibung wechselt.


    Bei ``bc`` ist die `-l`-Option überflüssig.


    Da sind zwei unnötige Semikolons drin.

    Bash
    #!/bin/sh
    temp=$(grep t= /sys/bus/w1/devices/28-00000d5b4f4a/w1_slave | cut -c30-)
    temp=$(echo "scale=2; $temp/1000" | bc)
    echo "$temp Grad Celsius"
    sed -i "s/^aktuelle Temperatur.*/aktuelle Temperatur $temp Grad/" /var/www/html/thomas/index.htm

    Ist IMHO aber ein bisschen fragil, und wenn man mal was ändert und falsch macht, sollte man von der index.htm besser eine aktuelle Sicherung haben. Sicherer wäre es eine Template-Datei zu haben und aus der dann die gefüllte HTML zu erstellen. Also das was Tell in Beitrag #2 vorgeschlagen hat.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • Es gibt bessere Ansaetze, aber wenn es sein muss:


    template.html

    Eine andere Alternative ist heredocs oder envsubst. Das geht dann ganz ohne sed. Ist jedenfalls wesentlich weniger fehleranfaellig und aenderungsfreundlicher als im sed Kontextinformationen mitzuliefern.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

    Edited 2 times, last by framp: Typos ().

  • hyle Oh, das weiss man nicht. Vielleicht kommt "aktuelle Temperatur" noch wo anders vor, dort aber nicht am Zeilenanfang. 🤓

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • kommt "aktuelle Temperatur" noch wo anders vor,

    hyle Der sed Ansatz funktioniert gut wenn man 80% sicher sein kann dass der Ersetzungsstring nur einmal vorkommt. Auch wenn man spaeter mal das html aendert. Wenn man aber 100% sicher sein will nimmt man einen Templateansatz. Unter Wartungsgesichtspunkten sollte alles andere als templates sowieso verboten werden :shy:

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Hallo zusammen,

    vielen Dank für die rege Diskussion.

    Für mich ist dieser Punkt nun abgeschlossen.

    Und obwohl ich Anglizismen nicht gut finde:

    Never touch a running system.

    Auf Deutsch:

    Es läuft und das ist gut so.

    :bravo2:

    VG

    Thomas

  • Es läuft und das ist gut so.

    ... bis zur naechsten Aenderung :lol:

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)