RegExp -lause aiheuttaa harmaita hiuksia

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ää.
8447
Äänestä

Muut lukivat myös

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'

Äänestä
  • 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 :)

    Äänestä

  • sanomankäsitteljä kirjoitti:

    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.

    Äänestä

Sedillä seuraavaa ehkä
sed -n '/UserID Type/{s/^.*

Äänestä

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?

Äänestä
  • 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.

    Äänestä

  • viännös tulee kirjoitti:

    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 ;)

    Äänestä

  • sanomankäsittelijä kirjoitti:

    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.

    Äänestä

Kommentoi aloitusta


sanomankäsittelijä kirjoitti:

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ää.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu