Tarkistin muut vastaukset, mutta en saanut asianmukaista selitystä tämän tekemiseen.
I on merkkijonomuuttuja nimeltä id
siten, että id="{"name":"john"}"
. Kuinka saan 2 muuttujaa tästä merkkijonosta, kuten-
key="name" value="john"
Yksityiskohtainen selitys olisi tervetullut, koska haluan ymmärtää merkkijonojen jäsentämisen bashissa.
Toistaiseksi olen poistanut aaltosulkeet {}
merkkijonosta-
id="$( echo "${id}" | tr -d {} )"
En voi sisällyttää "
sinne se heittää virheen. Etsitään lopulta jotain esimerkiksi id.split(":")
, jotta saat taulukon.
Kommentit
Vastaa
Käyttämällä jq
:
id="{"name":"john"}" key=$(jq -r keys[] <<<"$id") value=$(jq -r .[] <<<"$id")
-r
: Tällä asetuksella suodatin s tulos on merkkijono, se kirjoitetaan suoraan vakiotulosteeseen sen sijaan, että se muotoillaan JSON-merkkijonoksi lainausmerkeillä.
keys
: Sisäänrakennetut toimintonäppäimet, kun annettu objekti, palauttaa avaimensa taulukossa.
json
:
id="{"name":"john"}" key=$(json -ak <<<"$id") value=$(json -a "$key" <<<"$id")
-a
käsittelee syötteen matriisina
-k
palauttaa avainarvot
Kommentit
- kiitos selityksestä. Toimii hyvin. Luulen, että ' ei ole mitään tapaa jäsentää merkkijonoa ilman
jq
bash-komentosarjoissa. - @kev: Merkkijonoja on paljon jäsentää, mutta se on ' eräänlainen epäreilu kutsua tätä merkkijonoksi eikä json-tiedoksi.
- @kev JSON-tiedot voidaan koodata. Sen jäsentämiseksi sinun on mahdollisesti purettava se. JSON ei myöskään välitä välilyönneistä (uudet viivat jne.) Avainten ja arvojen välillä, joten sinun on otettava se huomioon. Tämän ovat jo tehneet sinulle taustalla olevan JSON-jäsentimen kirjoittajat ryhmässä
jq
.
Vastaa
Pyysit kirjaimellisesti understand string parsing in bash
, joten kirjoitan vastauksen tätä ajatellen, vaikka se on väärä ratkaisu ongelmasi . Voit käyttää bashia itse tehdäksesi mitä haluat, if sinulla on todella puhdas tiedot ilman erikoismerkkejä, joissa erityinen määritellään kaikeksi, mikä ei ole [A-Za-z0-9 ]
:
$name":"john"}" $ # remove everything through the first "{" $ echo $id "name":"john"} $ # remove everything starting with the last "}" $ echo $id "name":"john" $ name="${id%:*}" # take everything before the ":" $ name="${name//\"/}" # remove quotes $ echo $name name $ value="${id#*:}" # take everything after the ":" $ value="${value//\"/}" # remove quotes $ echo $value john
Olet myös todennäköisesti huomannut, että täytyy välttää erikoismerkkejä, kuten }
, {
ja "
. Niin kauan kuin muistat saada oikean, voit kirjoittaa tällaisen koodin melko helposti, mutta niin yksinkertaista kuin se onkin, se on suuntaus kohti vain kirjoituskoodia. Kun palaat tähän koodin vuodessa tai kahdessa käyttääksesi sitä uudelleen, tarkastelet jotain esimerkiksi #*\{}
ja ajattelet itsellesi, WTF tarkoittaakö sitä edes? ja kopioi se sitten sokeasti uuteen projektiin ja koodisi hajoaa hienovaraisesti, koska se kohtaa erikoismerkkejä, joita et odottanut.
Yllä olevat esimerkit hajoavat, jos nimi-arvo-parissasi on erikoismerkkejä, kuten aaltosulkeita tai pakenut lainausmerkit tai kaksoispisteet tai todennäköisesti muita merkkejä. Joten tämä toimii hyvin joissakin nopeasti ja likaisessa kaapimisessa tai 80%: n käyttötapauksessa, mutta sinun ei todellakaan pidä käyttää sitä tuotannossa tai milloin tahansa sinun on varmistettava, että se toimii aina minkä tahansa syötteen kanssa.
Jopa ilman echo
-lausekkeita, jotka osoittavat sinulle mitä tapahtuu, voit nähdä, että tämä koodi on jo pidempi kuin toisen vastauksen esimerkit, jotka osoittavat, miten se tehdään asianmukaisesti. Joten jos et käytä kolmannen osapuolen työkalua, annat itsellesi enemmän koodia kirjoittaa, mikä vie kauemmin sekä kirjoittamiseen että virheenkorjaukseen, ja päädyt myös ratkaisuun, joka on vähemmän joustava ja joka tauko, kun kohtaat jotain odottamatonta.
Kommentit
- tämä oli varsin informatiivista – voi ' t ymmärrä, miksi ihmiset äänestäisivät halvemmalla
vastaus
Vaihtoehtoisesti voit käyttää kävelyreittipohjaista unixia apuohjelma jtc
:
id="{"name":"john"}" bash $ key=$(jtc -w"[0]<>k" <<<"$id") bash $ echo $key "name" bash $ value=$(jtc -w"[0]" <<<"$id") bash $ echo $value "john" bash $
PS> Disclosure: Minä olen jtc
– shell cli -työkalun luoja JSON-operaatioille
jq
on muiden käytössä, mutta en voi mitenkään jäsentää tätä ilman kolmatta osapuolta -työkalu?awk
,sed
jagrep
ovat myös kolmannen osapuolen työkaluja. Jos käytätjson
-tietoja, ei ole mitään syytä olla käyttämättä asianmukaisia työkaluja niiden käsittelyyn.