Teen Linux-skriptiä, jolla tutkitaan erilaisia teksti- sekä xml-tiedostoja. Ko. tiedosoista kaivellaan tietoja regular expression -lauseiden avulla. Nyt pitäisi saada haettua tietoa yhdestä xml-elementistä, joka sisältää yhden attribuutin. Sen lauseen tekeminen onkin sitten vaikeaa.
Eli tuo elementti oli seuraavanlainen:
12345
ja seuraavalla lauseella yritän poimia tuota elementin sisältöä '12345':
tr -d '\n\r' |grep -i -E -o '().*()' |sed -n -e 's/.*\(.*\).*/\1/p'
kauhea sekametelisoppa, mutta en vaan nyt saa päähäni mikä tuossa mättää.
Eli tuo elementti oli seuraavanlainen:
12345
ja seuraavalla lauseella yritän poimia tuota elementin sisältöä '12345':
tr -d '\n\r' |grep -i -E -o '().*()' |sed -n -e 's/.*\(.*\).*/\1/p'
kauhea sekametelisoppa, mutta en vaan nyt saa päähäni mikä tuossa mättää.
Vastaukset 8
Vanhimmat
Olisiko mahdollista käyttää jotain kunnon skriptikieltä, esim. perliä tai pythonia, ja niiden xml-kirjastoja? Olisi xml-tiedostojen käsittely huomattavasti helpompaa.
Regexpeistä, grep:in lauseessa on kirjoitusvirhe, pitäisi varmaan olla UserID, ei UserD.
Mutta, noi sun regexpit on mun mielestä liian monimutkaisia, jos vain haluat elementin sisällön talteen. Grepille ei edes tarvitse antaa regexpiä, vaan pelkästään esim. "UserID Type=". Ja jos sua ei kiinnosta type-attribuutin arvo, ei siitä kannata ottaa turhaan paineita. Toimisiko esim. seuraava paremmin.
tr -d '\n\r' | grep "UserID Type=" | sed -n -e 's/\(.*\)/\1/p'
Hieman oli kirjoitusvirheitä mukana joo. Mutta tässä tapauksessa perlit, pythonit yms. eivät tule kyseeseen koska tämä skripti on osa muuta toiminnallisuutta ja edellytyksenä on säännöllisten lausekkeiden käyttö.
Attribuuttien arvolla ei tässä tapauksessa ole merkitystä, vaan ainoastaan tuo elementin sisältö kiinnostaa, eli se pitäisi saada palautettua. Valitettavasti antamasi komento ei toiminut ihan kuten piti. Se nimittäin palautti koko XML-aineiston :)
Sainkin tuon oman versioni toimimaan kun sovelsin antamaasi vinkkiä! Eli poistin tuon attribuutin arvon tutkinnan tuolla .* valitsimella.
Sedillä seuraavaa ehkä
sed -n '/UserID Type/{s/^.*
Kysäsen tässä samalla semmoista, että entäs jos on useampi attribuutti samassa elementissä ja niistä pitäisi sitten poimia dataa? Varmaan tarvitaan ainakin yhtä monta 'sed'-lausetta?
Tuohon ei varmaan kannata enää lähteä regexeillä. Koodaa ennen jollain kielellä pieni sovellus.
Menee muuten poskettoman hankalaksi tehdä ja vielä vaikeammaksi ylläpitää. Pienempi riesa istua vähäksi aikaa editorin ääreen koodaamaan. XML-jäsentäjiä on netissä yllin kyllin.
Kuten aiemmin mainitsin, niin ei ole mahdollisuutta käyttää ulkoisia sovelluksia, vaan on pärjättävä näillä "regexpeillä". Eihän tässä muutoin mitään ongelmaa olisikaan, jos voisi koodata jonkin ulkoisen softan. Käteni ovat siis sidotut ;)
Epäilen ettet perusregexeillä saa tuollaista toiminnallisuutta edes kasaan. Uusilla Perlin regexin tapaisilla onnistuu, mutta niilläkin toimiva konsepti näyttää menevän monimutkaiseksi kun kokeilin.