[BASH] sed gebruiken om een stuk tekst te trimmen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dolan
  • Registratie: Januari 2007
  • Laatst online: 10-09 09:34
Ik ben nu al een poosje bezig met bash in linux en OSX. Ik snap helaas vrij weinig van het sed commando. Ik krijg maar niet voor elkaar wat ik wil. Het volgende is het probleem:

Ik wil graag een stukje tekst via Geektool (OSX) op m'n bureaublad laten verschijnen. Nu gaat het om het stukje tekst. Ik wil graag uit de volgende URL een stuk knippen/trimmen: http://www.knmi.nl/rssfeeds/knmi-rssweer.cgi

Ik heb met sed al voor elkaar gekregen dat de juiste lijn geselecteerd wordt en dat alle html tekens verdwijnen. (Dank je wel tante google :))

$ curl --silent http://www.worldmeteo.info/nl/weer.html?id=NLXX0028 | grep 'Actuele omstandigheden' | sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
Het weer voor Arnhem/Dieren, NederlandSla deze locatie opLaatste update: 31/3/10 @ 13:25 uur lokale tijd (UTC 2)Gegevens afkomstig van: Deelen, NederlandTemperatuur: 9 &#0176;CGevoelstemperatuur: 4 &#0176;CActuele omstandigheden: Overwegend bewolkt / WindDauwpunt: 1 &#0176;CLuchtvochtigheid: 58%Luchtdruk: 993.9 hPa  Zicht: 10.0 kmWind: 40 km/h - Z (190&#0176;)UV-index: 1 (Laag)Maan: Afnemende bultZonsopgang: 7:14 uurZonsondergang: 20:08 uur


Nu wil ik graag alleen "Overwegend bewolkt" overhouden. Hoe kan ik dit het beste aanpakken?

Acties:
  • 0 Henk 'm!

  • winkelwagen
  • Registratie: Maart 2006
  • Laatst online: 08-09 08:36
Nu ben ik erg slecht met reguliere expressies, maar kun je niet zoiets doen als:
code:
1
.* omstandigheden: (.*) \/ (.*)


Volgens visual REXEXP levert dit op:
Het weer voor Arnhem/Dieren, NederlandSla deze locatie opLaatste update: 31/3/10 @ 13:25 uur lokale tijd (UTC 2)Gegevens afkomstig van: Deelen, NederlandTemperatuur: 9 °CGevoelstemperatuur: 4 °CActuele omstandigheden: Overwegend bewolkt / WindDauwpunt: 1 °CLuchtvochtigheid: 58%Luchtdruk: 993.9 hPa Zicht: 10.0 kmWind: 40 km/h - Z (190°)UV-index: 1 (Laag)Maan: Afnemende bultZonsopgang: 7:14 uurZonsondergang: 20:08 uur

Dus dan kun je groep 1 pakken: Overwegend bewolkt

Acties:
  • 0 Henk 'm!

  • WoRsTeNBoY
  • Registratie: Januari 2005
  • Laatst online: 21-01-2024
code:
1
2
echo 'Het weer voor Arnhem/Dieren, NederlandSla deze locatie opLaatste update: 31/3/10 @ 13:25 uur lokale tijd (UTC 2)Gegevens afkomstig van: Deelen, NederlandTemperatuur: 9 °CGevoelstemperatuur: 4 °CActuele omstandigheden: Overwegend bewolkt / WindDauwpunt: 1 °CLuchtvochtigheid: 58%Luchtdruk: 993.9 hPa  Zicht: 10.0 kmWind: 40 km/h - Z (190°)UV-index: 1 (Laag)Maan: Afnemende bultZonsopgang: 7:14 uurZonsondergang: 20:08 uur'  \
| sed 's/.* omstandigheden: // ; s/\/.*//'


zou het moeten doen,

de s is voor substitute, dan je patroon ".* omstandigheden: " door niets vervangen, en met de ; kan je een 2e expressie ineens meergeven ipv nomaals naar sed te pipen,

hopelijk helpt het

Acties:
  • 0 Henk 'm!

  • Dolan
  • Registratie: Januari 2007
  • Laatst online: 10-09 09:34
ah kijk nu komen we ergens. Ik snap nog steeds niet helemaal hoe het werkt:

$curl --silent http://www.worldmeteo.info/nl/weer.html?id=NLXX0028 | grep 'Actuele omstandigheden' | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | sed -e 's/.* omstandigheden: // ; s/\/.*//'
Overwegend bewolktDauwpunt: 1 &#0176;CLuchtvochtigheid: 54%Luchtdruk: 993.9 hPa  Zicht: 10.0 kmWind: 39 km


dus mijn 1e patroon is ".* omstandigheden". Hij pakt dan alle tekst tot daar en vervangt het door niets. Alleen het laatste gedeelte pakt ie dus niet zoals hierboven te zien is. Nogmaals naar sed pipen dan maar? Want nu moet ie dus vanaf "Dauwpunt" alles verwijderen/vervangen door niets.

edit:

Zo werkt ie wel:

curl --silent http://www.worldmeteo.info/nl/weer.html?id=NLXX0028 | grep 'Actuele omstandigheden' | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | sed -e 's/.* omstandigheden: // ; s/\/.*//' | sed -e 's/Dauwpunt.* //' | sed -e 's/km//'

[ Voor 22% gewijzigd door Dolan op 31-03-2010 14:38 ]


Acties:
  • 0 Henk 'm!

  • WoRsTeNBoY
  • Registratie: Januari 2005
  • Laatst online: 21-01-2024
en die s/.../.../ expressies kan je samenvoegen met ; zodat je maar 1 call naar sed moet doen
code:
1
curl --silent http://www.worldmeteo.info/nl/weer.html?id=NLXX0028 | grep 'Actuele omstandigheden' | sed -e :a -e 's/<[^>]*>//g;/</N;//ba ; s/.* omstandigheden: // ; s/\/.*// ; s/Dauwpunt.* // ; s/km//'


de "s/\/.*//" gaat een / vervangen door niets, maar die / moet je met een \ escapen anders denkt sed dat je al een 2e veld wil opgeven

EDIT:

nu ik het beter bekijk is die "s/\/.*//" niet nodig, dit was na ik dit zag:

"Overwegend bewolkt / Wind" en dus alles na de / wou wegdoen, wat fout is, ik denk dat jij de volle tekst "Overwegend bewolkt / Wind" wilt ?

overigens vind ik je sed overmatig complex, ik zou voor dit gaan:


code:
1
2
3
curl --silent http://www.worldmeteo.info/nl/weer.html?id=NLXX0028 | \
grep 'Actuele omstandigheden' | \
sed -e 's/.* omstandigheden: //; s/<\/b>.*//'

[ Voor 40% gewijzigd door WoRsTeNBoY op 31-03-2010 17:46 ]