von Text-Datei nach html-Datei konvertieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Scheidewasser
Beiträge: 20
Registriert: 14.09.2019 18:52:26

von Text-Datei nach html-Datei konvertieren

Beitrag von Scheidewasser » 29.11.2020 23:02:28

Hallo,

möchte 14 ( .) ) Textdateien nach html konvertieren. Das Problem habe ich mit sed's replace, insert, add usw. gelöst. Das sind 21 Zeilen und sieht etwas abenteuerlich aus. Ich frage mich, ob das nicht auch kürzer geht.

Jede Textdatei besteht aus 3 Zeilen:

Zeile-1 = 1 Zeile
Zeile-2 = 1 Zeile
Zeile-3 = 1 Zeile möglich, kann eine Endloszeile sein, aber auch 10 oder weniger oder mehr Einzelzeilen. Also Rest der Datei.

Es muß möglich sein mittels eines loop diese Zeilen in html tags zu übertragen und das ganz ohne sed awk oder grep. Wenn ich zum Beispiel Zeile-1 zwischen <h2></h2> tags bringen möchte und Zeile2 zwischen <h3></h3> tags und Zeile 3 zwischen <p></p> tags, wie mache ich das mittels einer $VARIABELEN oder was ich gelesen habe, es gibt $1 $2 $3 $4 ...? Es gibt auch Beispiele wo eine ganze Datei nach $line eingelesen wird und anschließend in Variablen aufgesplittet wird. Leider kann ich damit nichts anfangen, weil ich es nicht verstehe. Ein anderes Problem ist das ich mein Problem nicht genauer in englischer Sprache beschreiben kann, sonst hätte ich es vermutlich via google gefunden. Hat jemand eine Idee?

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: von Text-Datei nach html-Datei konvertieren

Beitrag von eggy » 29.11.2020 23:51:13

Beispieldatei

Code: Alles auswählen

Zeile1
Zeile2
Zeile3 
foo
bar
foobar

Code: Alles auswählen

awk 'NR==1{print "<h1>"$0"</h1>";next;} NR==2{print "<h2>"$0"</h2>\n<p>"; next;} {print $0} END{print"<p>"}' beispiel.txt
Meinst Du so? Falls ja, erklär ich gerne was da passsiert und warum.
Awk ist wirklich nicht schwer, nur der erste Einstieg fällt nicht so leicht. Wenn man das Grundkonzept aber mal erklärt bekommen hat, geht es jedoch ganz einfach. (Bis man dann zu den furchterregenden Reg-Echsen vordringt, aber das ist nochmal nen anderes Thema :mrgreen: )

Scheidewasser
Beiträge: 20
Registriert: 14.09.2019 18:52:26

Re: von Text-Datei nach html-Datei konvertieren

Beitrag von Scheidewasser » 01.12.2020 20:57:50

Hallo @eggy,

danke für die Idee, aber ich meine was anderes.

Ich habe 14 Dateien mit Einzeilern wie diesem:
1. Lorem ipsum
2. Ut wisi enim ad minim veniam.
3. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum.
4. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat nulla facilisi.
5. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat.
6. ...
Außerdem habe ich ein html.tpl Template mit diesem Inhalt, das drei Variable $ZEILE1 $ZEILE2 $ZEILE3 enthält:

Code: Alles auswählen

<html>
    <head>
    </head>
    <body>
      <h2>$ZEILE1</h2>
          <h3>$ZEILE2</h3>
             <p>$ZEILE3</p>
    </body>
</html>
Das Ergebnis soll so aussehen:

Code: Alles auswählen

<html>
    <head>
    </head>
    <body>
      <h2>1. Lorem ipsum.</h2>
      <h3>2. Ut wisi enim ad minim vniam.</h3>
       <p>3. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum. 4. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat nulla facilisi. 5. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat.</p>
    </body>
</html>
202012011134.txt ---> html.tpl = 202012011134.html
...

Meine Frage ist jetzt, wie bringe ich die Zeilen aus der Textdatei in die Variablen des Template und schreibe daraus eine dritte Datei?

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: von Text-Datei nach html-Datei konvertieren

Beitrag von Meillo » 01.12.2020 21:35:10

Scripting-Contest, Juhu! :-)

Hier mal als Evolutionsprozess meiner Versuche:


Nicht besonders schoen und auch nicht besonders sicher (wegen eval und Anfuehungsstrichen), aber mal als Ansatz:

Code: Alles auswählen

ZEILE1="`sed -n 1p foo.txt`"
ZEILE2="`sed -n 2p foo.txt`"
...usw...

eval "echo \"`cat html.tpl`\"" >foo.html

Die Variablen koennte man auch automatisiert anlegen lassen, z.B. so:

Code: Alles auswählen

awk '
{ printf("ZEILE%d=\"%s\"\n", NR, $0); }
END { print "eval \"echo \\\"`cat html.tpl`\\\"\" >foo.html"; }
' foo.txt | sh
(Gleiche Nachteile wie die erste Variante, bloss weniger Schreibarbeit.)


Hier noch eine Variante ohne eval:

Code: Alles auswählen

awk '{ printf("s#\\$ZEILE%d#%s#g\n", NR, $0); }' foo.txt |
                sed -f- html.tpl >foo.html
(In foo.txt duerfen keine `#' vorkommen. Sonst die drei `#' durch ein anderes Zeichen ersetzen, das in foo.txt nicht vorkommt.)

Die letzte Variante waere mir gut genug, aber es ginge sicher auch noch toller.

eggy steht bestimmt schon in den Startloechern. ;-)
Use ed once in a while!

Korodny
Beiträge: 721
Registriert: 09.09.2014 18:33:22
Lizenz eigener Beiträge: GNU Free Documentation License

Re: von Text-Datei nach html-Datei konvertieren

Beitrag von Korodny » 01.12.2020 21:42:00

Ich würde das (mangels sed-Kenntnissen) anders lösen:

1. Sicherstellen, dass die Einzeiler durch Leerzeilen getrennt sind.
2. Der ersten Zeile ein "#<SPACE>" voranstellen
3. Der zweiten Zele ein "##<SPACE>" voranstellen

Jetzt hast du ein valides Markdown-Dokument, dessen erste Zeile als "Überschrift 1. Grades" definiert ist, die zweite als "Überschrift 2. Grades", alle anderen als normale Absätze. Das lässt sich mit Debianpandoc in ein entsprechendes HTML-Dokument konvertieren, dabei kannst du auch eigene Templates vorgeben.

Benutzeravatar
TRex
Moderator
Beiträge: 8326
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: von Text-Datei nach html-Datei konvertieren

Beitrag von TRex » 01.12.2020 23:52:06

Ich hätte ein python-Script geschrieben, die Textdatei in eine Liste eingelesen... ach, hier:

Code: Alles auswählen

# -*- coding: utf-8 -*-
import os
import sys
from string import Template

inputfile = sys.argv[1]
assert os.path.isfile(inputfile), "Keine Datei angegeben (erster Parameter)!"
input_lines = open(inputfile, "r").readlines()
template = Template("""
<html>
    <head>
    </head>
    <body>
      <h2>$ZEILE1</h2>
          <h3>$ZEILE2</h3>
             <p>$ZEILE3</p>
    </body>
</html>""")
print(template.substitute({
    "ZEILE1": input_lines[0],
    "ZEILE2": input_lines[1],
    "ZEILE3": " ".join(input_lines[2:]),
}))

edit: Dateiname von Shell gelesen, Fehlerbehandlung dafür hinzugefügt.


edit:
Meillo hat geschrieben: ↑ zum Beitrag ↑
02.12.2020 08:45:52
Die Zeilen ab 3 sollen wohl in einen einzigen Paragraphen kommen.
Oh, dieses Detail ist mir entgangen. fixd
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: von Text-Datei nach html-Datei konvertieren

Beitrag von eggy » 02.12.2020 00:18:43

Meillo hat geschrieben: ↑ zum Beitrag ↑
01.12.2020 21:35:10
eggy steht bestimmt schon in den Startloechern. ;-)
:mrgreen: :THX:
@Meillo: also grundsätzlich schon, nur weis ich grad nicht, was ich zu erst machen soll ... aber vielleicht liefer ich demnächst noch was nach

@Korodny: coole Idee! Wie zum Geier kommt man denn auf sowas?! Genial :THX:
(Notiz an mich: dringend Scriptingtunnelblick um pandoc erweitern)

@Meillo: falls Du grad Zeit hast, zeig Korodny doch mal, wie man das Voranstellen von der Anzahl # in Bezug auf die Zeilennummer mit sed leicht (?) hinbekommt. Mit awk würd ichs in etwa so machen, ungetestet:

Code: Alles auswählen

awk 'NR<3{for (i=NR; i>0; i--) {printf "#"}; printf " "} { print $0}'
Offtopic: und falls Du noch mehr Zeit übrig hast: mein "A alias" bedarf noch der Überabeitung, damit die Funktion dann am Ende des Monats einsatzbar ist

Edit: kleinen Fehler im awk gefixt

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: von Text-Datei nach html-Datei konvertieren

Beitrag von Meillo » 02.12.2020 08:45:52

eggy hat geschrieben: ↑ zum Beitrag ↑
02.12.2020 00:18:43
@Meillo: falls Du grad Zeit hast, zeig Korodny doch mal, wie man das Voranstellen von der Anzahl # in Bezug auf die Zeilennummer mit sed leicht (?) hinbekommt.
So vielleicht:

Code: Alles auswählen

sed '1s,.*,# &\n,; 2s,.*,## &\n,;'
(Ich habe mir den Ausgangspost nochmal angeschaut. Die Zeilen ab 3 sollen wohl in einen einzigen Paragraphen kommen. Darum ab da keine Leerzeilen mehr.)

Die Idee, ueber Markdown und Pandoc zu gehen, finde ich auch klasse. Das ist schoen out-of-the-box gedacht! :THX:
Use ed once in a while!

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: von Text-Datei nach html-Datei konvertieren

Beitrag von eggy » 02.12.2020 16:02:52

Scheidewasser hat geschrieben: ↑ zum Beitrag ↑
01.12.2020 20:57:50
Ich habe 14 Dateien mit Einzeilern wie diesem:
Der Satz verwirrt mich sehr. Ist das von Dir gezeigte Beispiel
a) eine Datei mit einer Anzahl von n Zeilen und von dieser Art gibt es 14 Dateien, die alle ähnlich benannt sind?
oder
b) oder sind das die 14 Einzeiler, die jeweils in einer eigenen Datei sind?
Scheidewasser hat geschrieben: ↑ zum Beitrag ↑
01.12.2020 20:57:50
Meine Frage ist jetzt, wie bringe ich die Zeilen aus der Textdatei in die Variablen des Template und schreibe daraus eine dritte Datei?
Unter der Annahme, dass a) zutrifft und weiterhin unter den Annahmen, dass diese Dateien mit ".txt" enden, nur diese Dateien mit "txt" enden und alle im selben Verzeichnis liegen und jeweils mindestens drei Zeilen haben*, und man dort problemlos wild Dateien erzeugen/überschreiben darf, das Template dort exisitert und den von Dir oben genannten Namen hat und der folgende Code auch dort als script.awk gespeichert ist und der Befehl dann nur in diesem Verzeichnis ausgeführt wird:
script.awk:

Code: Alles auswählen

BEGIN{ template = readfile("html.tpl") }

function readfile(file, tmp, save_rs) {  
    # die stammt aus https://www.gnu.org/software/gawk/manual/html_node/Readfile-Function.html
    save_rs = RS
    RS = "^$"
    getline tmp < file
    close(file)
    RS = save_rs
    return tmp
}


NR==1{ sub("\\$ZEILE1", $0, template);}
NR==2{ sub("\\$ZEILE2", $0, template);}

NR==3{derRest=derRest $0}
NR>3{derRest=derRest " " $0}

END{sub("\\$ZEILE3", derRest, template); print template}

Befehl:

Code: Alles auswählen

find . -iname '*.txt' | xargs -L1 -I{} basename "{}" .txt | xargs -I {}  sh -c "awk -f script.awk {}.txt > {}.html"
(* : und damit auch keine Einzeiler sind)

Antworten