Portál AbcLinuxu, 10. května 2025 03:14
jmeno="pazout" vek=32 povolani="bez prace" vek=70 poznamka="" povolani="v duchodu" jmeno="kadrnozkova" druh="verny" vek=120 jmeno="jonatan" povolani="pes"a chtel bych z nej (nejspis awkem?) vypsat pouze policka "jmeno" a "vek", abych dostal:
jmeno="pazout" vek=32 jmeno="kadrnozkova" vek=70 jmeno="jonatan" vek=120ale stale se nedari. prosim pomozte diky
while read x; do eval "$x"; echo jmeno=\""$jmeno"\" vek="$vek"; done <souborale samozřejmě vede k problémům, pokud se v souboru objeví podezřelé věci... Na druhé straně escapování dat nespecifikuješ, takže těžko říci, co se může objevit a jak.
$ cat test
jmeno="pazout" vek=32 povolani="bez prace"
vek=70 poznamka="" povolani="v duchodu" jmeno="kadrnozkova"
druh="verny" vek=120 jmeno="jonatan" povolani="pes"
$ sed -n 's/.*\(jmeno="[^"]*"\).*\(vek=[0-9]*\).*\|.*\(vek=[0-9]*\).*\(jmeno="[^"]*"\).*/\1\4 \2\3/p' < test
jmeno="pazout" vek=32
jmeno="kadrnozkova" vek=70
jmeno="jonatan" vek=120
Problem je, pokud by tech "zajimavych" hodnot bylo vic. Timhle zpusobem to jde napsat maximalne na tri hodnoty
$ cat test
jmeno="pazout" vek=32 povolani="bez prace"
vek=70 poznamka="" povolani="v duchodu" jmeno="kadrnozkova"
druh="verny" vek=120 jmeno="jonatan" povolani="pes"
jmeno="jmeno1"
vek=77
nic
$ awk 'function extract(l, r) { if(match(l, r) != 0) v=substr(l, RSTART, RLENGTH); else v=""; return v } { jmeno=extract($0, "jmeno=\"[^\"]*\""); vek=extract($0, "vek=[0-9]*"); if(jmeno && vek) print jmeno " " vek;}' < test
jmeno="pazout" vek=32
jmeno="kadrnozkova" vek=70
jmeno="jonatan" vek=120
Pak je moznost upravit to, pokud je jedna hodnota nalezena, nebo vsechny.
sed -e 's/^/{ /' -e 's/$/ },/' \ -e 's/ \([a-z]\+\)=/, \1:/g' \ -e 's/^{,/{/' \ > data.jsonPak doplň obalující [] a umázni poslední čárku. Nakonec v PHP si s tím už lehce poradíš:
#!/usr/bin/env php <?php $data = json_decode(file_get_contents('data.json')); foreach ($data as $row) { echo 'jmeno="', $row['jmeno'], '" vek="', $row['vek'], "\"\n"; }
while true ; do jmeno="N/A" vek="N/A" read line test $? -gt 0 && exit 0 eval $line echo jmeno=\"${jmeno}\" vek=${vek} donePokud jsou v tom nejake paznaky zaescapovane neshelovym zpusobem tak to samozrejme nepujde ale mozna i tak bude jednodussi to usedovat nez psat parser v jnem jazyce. Plus, je tam shellovy eval takze zadne neosetrene vsupy!
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.