Report 2 HTML + 2 szkript /awk, sed, grep/

Sziasztok, arrol lenne szo, h peldaul van egy ilyen szovegunk:

http://www.fit.vutbr.cz/study/courses/IOS/public/Lab/projekt1/ls.newrep…

A feladat pedig ugy szol hozza, h HTML kodda kell alakitani az egeszet, es igy kell majd mukodnie:
tee ls.newreport | ./report2html.sh >ls.html

es ez lesz belole:
http://www.fit.vutbr.cz/study/courses/IOS/public/Lab/projekt1/ls.html

= =

== ==

ahol dollar jel azokat

be
<, > es & a

 es 

kozott erre: <, > a &.
ures sor helyett betenni
taget
Ket helykoz es utann csillag, akk listat kell belole csinalni

ahol nincs semmi specialis jel annak a sornak a vegere szinten
taget kell tenni.

es egy szkriptet kell megirni ami ezt megcsinalja, mar awk val csinalom:), de nem muxik:).


#!/bin/bash
#/usr/awk -f
#``

awk 'BEGIN {print "", "" } >> $FILENAME +".html" '
# a H1 az majd igy fog kinezni reg awk '/^=$/' , H2 pedig igy ^==$

#read line

awk 'RS = "\n"'

if [^$] ; then awk ''/^$ /$/' {print"

"; for (i = 2; i <= NF; i = i + 1); NF+1 = "

"}'
fi

awk ''/^$ /$/' {print"

"}'


if awk  ''/^=$/'   {print ""}' then awk ''NF+1 '{print ""}'
if awk  ''/^==$/'   {print "

"}' then awk ''NF+1 '{print "

"}' awk 'END {print"", ""}' Igazól ma fekszem neki, de bármilyen segitség jol jon :) Segitsegeteket elore koszonom.

Hozzászólások

Szerintem először is válassz ki egy alkalmas szkriptnyelvet a feladat megoldásához. A shell szkriptet, ha lehet, kerüld, különben a megoldás karbantarthatatlan lesz, és bővíteni csak komoly hackelések árán lehet. Tisztán AWK-ban pl. megoldható a feladat, bár én nem vállalkoznék rá. Itt egy Perles megoldás (bár ez sem szép, sok benne a copy&paste):

http://pastebin.com/m1c5dff40

Erre a feladatra kifejezetten ajánlom a Perlt. A fenti szkript alapján talán nem is lesz nehéz elindulni.

:A shell szkriptet, ha lehet, kerüld, különben a megoldás karbantarthatatlan lesz, és bővíteni csak komoly hackelések árán lehet.

Ez baromság. A shell-t ugyanúgy meg kell (és lehet) tanulni, mint minden más nyelvet. Persze a többség nem veszi a fáradságot. A különbség mondjuk egy Perl-hez képest, hogy érdemes mellé megtanulni a grep - sed - awk - stb eszközöket is, de azt meg amúgy is érdemes.

Ne is tedd. Ominozus hozzaszolasodban amire valaszoltam, ez szerepelt: karbantarthatatlan lesz a shell script. Most meg azzal probalsz ervelni, hogy uj processz. Dontsd mar el, mit akarsz mondani. Az uj processz inditasa/nem-inditasa jo erv lehet. A karbantarthatatlansag nem az. Sok ember van, aki szerint Perl-lel nagyon konnyu nehezen olvashato kodot eloallitani, ami kicsit jobban ellentmond a karbantarthatosagnak, mint az "uj processz egy csere-muveletre".

NEM erről van szó. Shell scriptben, sed, grep, cut, tr, awk okos használatával rettentő sok dolgot meg lehet csinálni -- úgy is, hogy writeonly lesz a scrpit, meg úgy is, hogy szépen olvasható, használható.
Ha pl. nincs Perl, akkor irreleváns, hogy Perl-ben gyorsabb/szebb/jobb/stb. kód hegeszthető adott problémára -- a Perl abban az esetben nem játszik, mint ahogy itt sem.

Az awk-ban fogod azokat a mintákat, amik a sorokat megkülönböztetik:


$ cat atir.awk
BEGIN    { printf "<html>;\n<body>\n" ; }
/^\$/    { printf "\n<pre>%s</pre>\n", $0; }
$1~"^=$" { $1="<h1>"; $NF="</h1>"; printf "%s", $0; }
$1~"=="  { $1="<h2>"; $NF="</h2>"; printf "%s", $0; }
/^$/     { printf "</br>" ; }
/^  \*/  { $1="<li>"; printf  "%s</li>", $0 ; }
END      { printf "\n</body>\n</html>\n" ; }

És kirakod gyakorlatilag egy hosszú sorba, sortörés nélkül, majd a megfelelő helyekre berámolod a sortöréseket és a lista kezdetét meg végét sed-del:


$ cat csere.sed
s/<\/li><li>/<\/li>\n<li>/g
s/<\/h1><li>/<\/h1>\n<ul>\n<li>/g
s/<\/h2><li>/<\/h2>\n<ul>\n<li>/g
s/<\/br><li>/<\/br>\n<ul>\n<li>/g
s/<\/li><\/br>/<\/li>\n<\/ul>\n<\/br>/g

Az elején kell egy sed, ami a kiinduló szövegben cserélget, ez valahogy úgy néz ki, hogy:


$ cat elocsere.sed
s/</\&lt;/g
s/>/\&gt;/g

Az egészet meg egy parancssorban lefuttatod:


$ sed -f elocsere.sed < be.txt | awk -f atir.awk  | sed -f csere.sed  > ki.html

Esküszöm, ez volt az utolsó kacsacsőröket tartalmazó code blokk, amit beszenvedtem ide...Az awk-ba még kell egy sor, aminél a minta negálva tartalmazza az összes megadottat (azaz azok, amik nem illeszkednek rá, azokat simán ki kell írni, mögéjük rakva egy </br> tag-et.