Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: beh - 10.09.07 - klo:09.49

Otsikko: Merkkijonon manipulointi
Kirjoitti: beh - 10.09.07 - klo:09.49
Olen yrittänyt parsia seuraavalla rivillä olevan osoiteen erilleen, mutta huonolla menestyksellä

Koodia: [Valitse]
<strong>Ohjelman suora osoite:</strong> <a href="http://www.yle.fi/java/areena/dispatcher/810356.asx?bitrate=1000000">http://www.yle.fi/java/areena/dispatcher/810356.asx?bitrate=1000000</a> </p>

Yritin sekä sed:illä, että tämän kaltaisilla risukasoilla
Koodia: [Valitse]
string="`cat osoiterivi`"
echo ${string#substring} > osoiterivi
, missä osoiterivi on yllä mainittu rivi. Vika on kai siinä, etten osannut laittaa oikenalaista regexpiä substringiksi?

Voisiko joku tönäistä oikeaan suuntaan. Valmis vastauskin pienellä selityksellä kyllä kelpaisi, tuli käytettyä tähän jo sen verran aikaa :-\
Otsikko: Vs: Merkkijonon manipulointi
Kirjoitti: mgronber - 10.09.07 - klo:23.29
Vika on kai siinä, etten osannut laittaa oikenalaista regexpiä substringiksi?

Bash ei suoraan tue regexpiä vaan huomattavasti yksinkertaisempia sääntöjä. Yleensä tuollaiset täytyy ketjuttaa tarpeesta riippuen joko grepin tai sedin läpi. Alla yksi esimerkki miten tuon voi toteuttaa.

Koodia: [Valitse]
$ echo '<strong>Ohjelman suora osoite:</strong> <a href="http://www.yle.fi/java/areena/dispatcher/810356.asx?bitrate=1000000">http://www.yle.fi/java/areena/dispatcher/810356.asx?bitrate=1000000</a> </p>' \
| sed 's/^.*a href="\(.*\?\)".*$/\1/'
Otsikko: Vs: Merkkijonon manipulointi
Kirjoitti: beh - 11.09.07 - klo:14.16
Kiitos vastauksesta. Luulen jopa ymmärtäväni mitä tuossa tapahtuu, kun viimein hoksasin etsiä sed manuaalia, enkä vain bash oppaita, jotka eivät pureudu kovin syvälle yksittäisiin komentoihin.

Siis tuossa kai korvataan koko alkuperäinen rivi tällä \(.*\?\) (tai siis .*\?:llä) johon tuo \1 viittaa, vai kuinka. Ei  muuten ole tarpeen käyttää enää \? -merkkiä, eli pelkkä \(.*\) osuu samaan kohti.

Tosiaan aloittelijat ei välttämättä pelkillä man -sivulla kovin pitkälle pääse, joten tässä muillekin linkki sedin manuaaliin
 http://www.gnu.org/software/sed/manual/ (http://www.gnu.org/software/sed/manual/), tämän löytää googlellakin helposti.
Otsikko: Vs: Merkkijonon manipulointi
Kirjoitti: mgronber - 11.09.07 - klo:17.02
Siis tuossa kai korvataan koko alkuperäinen rivi tällä \(.*\?\) (tai siis .*\?:llä) johon tuo \1 viittaa, vai kuinka.

Juuri näin. Joissakin tapauksissa voisi olisi näppärämpää käyttää grep:n "-o"-valitsinta jos halutulle tekstille pystyy määrittelemään helposti ja yksikäsitteisesti sopivan regexp-määrityksen.

Lainaus
Ei  muuten ole tarpeen käyttää enää \? -merkkiä, eli pelkkä \(.*\) osuu samaan kohti.

Osuu jos osuu eikä uppoaminen ole varmaa... Mikäli loppuosaan riviä ilmestyy syystä tai toisesta yksi tai useampia lainausmerkkejä niin silloin tuo ahne versio haukkaa liikaa. Tästä syystä kysymysmerkin on syytä olla mukana.