eine Zeile mit definiertem Inhalt ersetzen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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

  • 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,

    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

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

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

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

    :no_sad: ... Kein Backupkein Mitleid ... :no_sad:
    :) Nutze lieber raspiBackup bevor Du in die Luft 💥 gehst wie ein HB Männchen :)

    2 Mal editiert, zuletzt von framp (18. November 2021 um 20:55) aus folgendem Grund: Typos

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

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!