Kirjoittaja Aihe: Merkkijonon manipulointi  (Luettu 2737 kertaa)

beh

  • Käyttäjä
  • Viestejä: 154
    • Profiili
Merkkijonon manipulointi
« : 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 :-\

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Merkkijonon manipulointi
« Vastaus #1 : 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/'

beh

  • Käyttäjä
  • Viestejä: 154
    • Profiili
Vs: Merkkijonon manipulointi
« Vastaus #2 : 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/, tämän löytää googlellakin helposti.

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Merkkijonon manipulointi
« Vastaus #3 : 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.