Ich übernehme gerade einige Teile aus einer älteren-FHEM-Konfiguration. Um mir die define und attr anzuzeigen, nehme ich grep auf die alte cfg-Datei.
grep "^define devicexyz" /opt/fhem.old/fhem.cfg
Wenn jedoch eine Definition über mehrere Zeilen geht, wird mir mit grep natürlich nur die erste Zeile angezeigt. Natürlich kann ich mir mit -A 20 auch die folgenden Zeilen anzeigen lassen.
Aber gibt es evtl auch einen eleganteren Weg mit grep, der mir automatisch die folgenden Zeilen anzeigt wenn diese zusammengehören - was man ja am Backslash als letzten Zeichen in der Zeile erkennen kann?
nein. grep arbeitet zeilenweise und weiss nichts von irgendwelchen Sonderbehandlungen.
du kannst aber das file vorher mit sed oder perl oder was auch immer passt so ändern das die zeilen zusammen hängen und dann das grep machen. etwas in der art:perl -p -e 's/\\\n/ /' <file> | grep ...
Hi,
ein ganz andere Weg würde mir noch einfallen:
- Eine zweite Instanz von FHEM mit der alten config starten
- dann mit list -r <devspec> die Definition exakt am Stück herausholen.
Gruß Otto
Die alte Config zu starten wollte ich vermeiden, da dort auch etliche LAN-Geräte angesprochen werden.
Und dann könnte einiges "durcheinander" kommen.
In einer VM ohne Netzwerk .... wäre meine persönliche Lösung. So sieht man mehr von dem, was eingerichtet ist.
Hm,
eigentlich sollte es nicht so schwierig sein, sowas wie ein "analysiere eine (andere) cfg, gibt die einzelnen Devices aus und biete eine Option zum Import an"-Modul zu bauen (oder sowas ggf. als Erweiterung für "installer" vorzuschlagen, das bietet ja auch schon einiges, um "fremde" cfg's zu analysieren).
Ist ja ähnlich wie bei attrTemplate: Man sieht, wo das nächste Device anfängt und könnte schlicht Kommentarzeilen, Leerzeilen bzw. solche ohne Inhalt und UUID überspringen...
Also ein "get" mit einer Deviceliste zur Anzeige/Ausgabe in FHEMWEB/telnet und ein "set ... import xyz" (wieder mit der Deviceliste)?
(Ich vermute, dass wir für sowas zunehmend Bedarf haben würden).
Hallo @roedert,
die Autoren der vorherigen Antworten haben recht: Perl, sed und awk sind hier die Werkzeuge der Wahl.
Aber auch mit grep kannst Du die gewünschten Zeilen herausholen, solange die relevanten Zeilen mit einem Backslash enden:
grep "^define devicexyz" /opt/fhem.old/fhem.cfg -A 100 | grep '.*\\$' -v -m 1 -B 100
Dabei muss 100 größer sein, als die maximale Anzahl an Zeilen, die Dein längstes define hat. Bei Bedarf an beiden Stellen einfach vergrößern.
Das erste grep liefert Dir die define-Zeile und 100 nachfolgende Zeilen.
Das zweite grep beschränkt das Ergebnis dann auf die erste Zeile ohne Backslash (am Zeilenende) und liefert genau diese und alle vorigen Zeilen.
Zitat von: Beta-User am 21 Februar 2020, 10:49:22
eigentlich sollte es nicht so schwierig sein, sowas wie ein "analysiere eine (andere) cfg, [...]"-Modul zu bauen
Hab' mal was gebastelt, kann aber nicht sagen, ob das "der Weisheit letzter Schluß" ist und v.a. nicht ausschließen, dass das üble bugs hat ;D .
"Es" kann jedenfalls: Eine beliebige cfg einlesen - die wird über das Attribut cfgfile festgelegt und mit einem "set ... reread" ausgewertet. In einem Internal stehen dann alle erkannten Devices, mit "get ... device ..." kann man dann ein Gerät wählen und bekommt ein Dialogfeld, in dem die Definition mit sämtlichen Attributen "importfertig" stehen sollte, das Ergebnis ist wieder (auch) in einem Internal zu finden.
Wer mag und kann, kann das gerne "verbessern"; es ist vermutlich am besten, FHEM zusätzlich über eine fast leere cfg zu starten, dort das Hilfsdevice zu definieren und dann die Devices rauszukopieren, die man braucht/sucht, ich habe das auch nur in einem Testsystem verwendet...
Viel Spaß,
Beta-User
Zur Info:
Habe hier einen neuen Thread zu der modularisierten Variante aufgemacht: https://forum.fhem.de/index.php/topic,109705.msg1036945.html#msg1036945
Alte Fassung kommt daher aus dem vorherigen Beitrag raus.