[bash] properties uit file in template verwerken

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
In mijn bash script wil ik d.m.v. een properties file een template bijwerken. De name van de property correspondeert met wat ik in de template wil veranderen door zijn value. Van de "properties file" gebruik ik alleen de name=value regels (rest is content).

props.properties
code:
1
2
3
4
5
6
aaa=foo
bbb=bar bar

# header #

paragraph


template.html
code:
1
2
3
bbb
ccc
aaa


Bash script
code:
1
2
3
4
5
6
7
8
TMP_TPL=`mktemp /tmp/my-tpl.XXXXX`
cat template.html > $TMP_TPL

grep ^[a-z]*=[a-z\ ]*$ props.properties | \
awk 'BEGIN { FS="="} {print "sed -e \"s/"$1"/"$2"/\" $TMP_TPL"}' | \
sh > $TMP_TPL

cat $TMP_TPL


Het resultaat zou moeten zijn:
code:
1
2
3
bar bar
ccc
foo


Echter het gaat niet goed met die $TMP_TPL (ook niet als ik daar een normale file voor gebruik). Het is nogal een constructie met die grep | awk + sed | sh... ik zou het graag horen hoe dit beter kan cq. hoe zoiets zou moeten.

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Wat dacht je van iets als dit:
cmd=`awk 'BEGIN {FS="="; printf "cat template.html "} {printf "| sed -e \"s/%s/%s/\" ", $1, $2}' props.properties`
sh -c "$cmd"


Een betere optie is overigens het direct met awk te search/replacen maar ik ben niet bekend genoeg met awk om dat direct uit m'n hoofd te doen ;)

[ Voor 30% gewijzigd door Wolfboy op 25-04-2010 03:10 ]

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Dat ziet er inderdaad eleganter uit. Ik krijg wel deze foutmelding, die ik al vaak gezien heb, en niet goed begrijp (Google helpt me ook niet echt):
code:
1
sed: first RE may not be empty

Ik gebruik overigens de standaard bash op een Mac (Snow Leopard).

Wat ik zelf nog wel aardig vond (maar wat eigenlijk niets oplevert) is een tussenstap om de properties in een temp file te zetten:
code:
1
2
3
TEMPFILE=`mktemp /tmp/my-prop.XXXXX`
grep ^[a-z]*=\"[a-z\ ]*\"$ test.properties > $TEMPFILE
source $TEMPFILE

Maar dan moet je alsnog daar itereren over de properties.

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Dit werkt nu goed voor mij:

code:
1
2
3
grep ^[[:lower:]\.]*=[[:print:]]*$ test.properties | \
awk 'BEGIN {FS="="; printf "cat template.html"}
{printf " | sed -e \"s/##%s##/%s/\"", $1, $2}' | sh


De "first RE may not be empty" kwam doordat de hele props.properties werd ingelezen (dus ook non-property regels). Die moest ik eerst even greppen.

Thanks Wolfboy :-) Uiteraard hoor ik graag nog betere oplossingen!

FYI, ik gebruik dit om bij de transformatie van markdown naar HTML ook properties bovenaan de markdown file te kunnen gebruiken, die in de HTML template worden omgezet. De markdown content komt ook centraal in deze template terecht. Dit (markdown + properties) is voor mij een effectieve manier om de (meta) content van HTML en PDF documenten te beheren.