Jäsennä merkkijono bash-komentosarjassa

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

  • Voimmeko varoittaa sinut pois tästä taktiikasta / raidasta, ennen kuin ' s on liian myöhäistä? Vaikuttaa siltä, että sinulla on jsonia tai muuta strukturoitua dataa; ehkä oma työkalu olisi turvallisempi tapa saada sinut sinne, missä jatkuu?
  • Huomasin, että jq on muiden käytössä, mutta en voi mitenkään jäsentää tätä ilman kolmatta osapuolta -työkalu?
  • Tuodatko nämä tiedot tiedostosta? Voisiko olla enemmän kuin yksi avain / arvo-pari? Miltä kaksoislainaus näyttäisi osana arvoa?
  • @kev: Teknisesti awk, sed ja grep ovat myös kolmannen osapuolen työkaluja. Jos käytät json -tietoja, ei ole mitään syytä olla käyttämättä asianmukaisia työkaluja niiden käsittelyyn.
  • Nämä tiedot ovat seurausta komennosta, jonka suoritetaan käsikirjoituksessani. Se on aina tässä muodossa – 1 avain ja 1 arvo.

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 

Tämä kaikki on kuvattu bash -oppaan kohdassa ”Parametrilaajennus”. Esimerkiksi ${parameter#word}, joka Remove matching prefix pattern poistaa tekstin word $parameter. Vastaavasti % poistaa jälkiliitteen. // korvaa merkkijonon kaikki esiintymät mitä tahansa sen jälkeen tulevalla (yllä olevassa ${foo//\"/} esimerkissä lainausmerkit (joista on vältettävä, joten näkyy \") korvataan tyhjällä merkkijonolla). Jokainen korvaus on suoritettava itsestään: et voi ”irrottaa merkkijonon ja loppua yhdellä komennolla.

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *