Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: beh - 10.09.07 - klo:09.49
-
Olen yrittänyt parsia seuraavalla rivillä olevan osoiteen erilleen, mutta huonolla menestyksellä
<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
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 :-\
-
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.
$ 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/'
-
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.
-
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.
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.