Klein beetje hulp nodig met shell-script

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • jmxd
  • Registratie: September 2005
  • Niet online
Hoi :)

Ik heb hier Geektool draaien, en i.c.m. met een script tover ik daarmee de komende afleveringen uit mijn persoonlijke rss-feed van myepisodes.com op mijn desktop.

Ik ben totaal geen programmeur, en na serieus uren van proberen en zoeken op internet hoe ik het in godsnaam precies zo krijg hoe ik wil, heb ik het bijna voor elkaar.

Het ziet er nu zo uit op mijn bureaublad:

Afbeeldingslocatie: http://files.jamiemarciano.me/geektool/6.png
Heb de feed een paar dagen terug gezet om het uit te testen

En het script wat dit voor elkaar krijgt ziet er zo uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh

URL="*****"

if [ $# -eq 1 ] ; then
  headarg=$(( $1 * 2 ))
else
  headarg="-16"
fi

curl --silent "$URL" | grep -E '(title>|description>)' | \
  sed -n '4,$p' | \
  sed -e 's/<title>//' -e 's/<\/title>//' -e 's/<description>/   /' \
      -e 's/<\/description>//' | \
  sed -e 's/<!\[CDATA\[//g' |            
  sed -e 's/\]\]>//g' |         
  sed -e 's/<[^>]*>//g' |
  sed s'/\[ \([a-zA-Z0-9]*\) \].*$/\1/' |
  grep -i -v 'h3' |
  grep -i -v '\.'
  head $headarg | sed G | fmt


Zoals je misschien al opgemerkt hebt doet de bug zich voor bij de serie "Hawaii Five-0 (2010)" & "Chase (2010)", daar draait hij de bracket van [S01E0.. om en laat hem zien wat niet de bedoeling is.

Heb hier al weer zo'n drie kwartier aan besteed en krijg die stomme bug er maar niet uit dus ik hoop dat hier een slimme tweaker mij kan helpen :+

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dit heeft niks met programmeren te maken, dit is imo aankloten. ;) Quick fix: De regel sed -e 's/\]\]>//g' | aanpassen in sed -e 's/\].*?\]>//g' | :+

Alternatief kun je je met 'man sed' en http://www.regular-expressions.info/ eens inlezen in wat dit script nu eigenlijk doet, en waarom je veels te vaak sed aanroept...

Of nog beter, aangezien je xml niet met regexp hoort aan te pakken: gooi dit weg en bekijk xsltproc.

[ Voor 23% gewijzigd door pedorus op 30-10-2010 01:46 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • jmxd
  • Registratie: September 2005
  • Niet online
Hmm, okay. Sorry dat het in het verkeerde forum stond. Op html en css na snap ik helemaal niks van dit soort talen :P
pedorus schreef op zaterdag 30 oktober 2010 @ 01:41:
Dit heeft niks met programmeren te maken, dit is imo aankloten. ;) Quick fix: De regel sed -e 's/\]\]>//g' | aanpassen in sed -e 's/\].*?\]>//g' | :+
Bedankt, alleen er is geen verschil tussen die twee. (de uitkomst dan)

Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 17:20
Twylight schreef op zaterdag 30 oktober 2010 @ 03:00:
Hmm, okay. Sorry dat het in het verkeerde forum stond. Op html en css na snap ik helemaal niks van dit soort talen :P
Dan is dit *het* moment om er wat van te leren!
Heb je al eens 'man curl', 'man grep' en 'man sed' gedaan?

Curl zal wel een URL ophalen en als tekst dumpen, die komt dan bij grep aan die er selectief dingen uitvist of weggooit. Daarna gaat sed ermee aan het werk om per regel wat search&replace dingen te doen.

sed is echt een geweldig mooie uitvinding! Het is supersimpel, enkel is het script wat er doorgaans in gaat voor een leek volmaakt onleesbaar. *DE* manier om indruk mee te maken op collega's of vrienden!
Een ander nadeel is dat de documentatie weliswaar klopt, maar niet eenvoudig is. Deze is al wat beter te begrijpen.

Een ander probleem wat je hebt als je dit wilt debuggen: je hebt nauwelijks een idee van wat je nou eigenlijk aan data binnenkrijgt en wat je probeert te verwerken. Mijn advies is om het commando 'tee' te gebruiken (en ja, dan kan je dus ook 'man tee' doen om er meer van te leren).
Doe bijvoorbeeld het volgende aanpassen:
code:
1
2
3
4
...
curl --silent "$URL" | grep -E '(title>|description>)' | tee debug.txt | \
  sed -n '4,$p' | \
...


'tee' splits z'n standard input in tweeen: hij stuurt het door naar die file 'debug.txt' en geeft het ook weer door naar z'n standard output. Afluisteren dus. Je kan in debug.txt nu in elk geval zien wat je sed-scripts aan invoer krijgen. Dan is het een kwestie van de sed manual een beetje snappen en stapje voor stapje debuggen. Lijkt mij veel meer opleveren dan als wij het voor jou gaan debuggen!

(en ja, als je wat meer gerichte vragen hebt kan je hier uiteraard wel terecht!)

Acties:
  • 0 Henk 'm!

  • jmxd
  • Registratie: September 2005
  • Niet online
Bedankt,

Ik heb nu
code:
1
sed 's/\[//g;s/\]//g;s/\S.*//g'
aan mijn script toegevoegd en dat verhelpt deze bug maar veroorzaakt weer een nieuwe...

Afbeeldingslocatie: http://files.jamiemarciano.me/geektool/7.png

Hij verplaatst dus de laatste ) bracket helemaal naar voren en draait hem om -O-

Hier kom ik echt niet uit ..


offtopic:
P.S.
Gefeliciteerd ;)

[ Voor 6% gewijzigd door jmxd op 30-10-2010 13:04 ]


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 17:20
Twylight schreef op zaterdag 30 oktober 2010 @ 13:04:
Ik heb nu
code:
1
sed 's/\[//g;s/\]//g;s/\S.*//g'
aan mijn script toegevoegd en dat verhelpt deze bug maar veroorzaakt weer een nieuwe...

[afbeelding]

Hij verplaatst dus de laatste ) bracket helemaal naar voren en draait hem om -O-
Nou kan ik niet helemaal raden wat je gedaan hebt, maar ik gok dat je die toevoeging niet helemaal op het einde, maar ergens er tussenin hebt geplaatst?
De volgorde van al die sed miniscripts is van belang: wat het eerste script heeft aangepast gaat naar het tweede; wat de tweede aanpast gaat naar de derde; enzovoort. Ik vermoed dat je jouw toevoeging ergens middenin of aan het begin hebt geplaatst en dat daardoor de latere scripts anders reageren dan voorheen.

(overigens vind ik dat derde stuk van jouw toevoeging behoorlijk grof: alles vanaf een hoofdletter-S tot einde regel weggooien... dat *moet* gewoon een keer mis gaan!)

Maar goed: ik heb hier geen idee wat er exact aan tekst die sed-keten in gaat - heb je daar sowieso al naar gekeken? Daarna stap voor stap kijken wat elk sed commando doet, desnoods de output daarvan ook weer naar een file sturen. Is op zich allemaal niet moeilijk, maar je moet er wel de tijd voor nemen om er gestructureerd doorheen te gaan.
[offtopic]P.S.
Gefeliciteerd ;)[/offtopic]
[offtopic]Bedankt![/offtopic]

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Kun je eens zo'n voorbeeld feed posten?
Ik vermoed dat er wel eenvoudiger manieren zijn om de output te parsen naar wat jij wil.

Heb je al eens gawk bekeken of grep -o ?

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 04-08 16:29

Tim

In dit geval is de RSS in een awk-vriendelijk formaat:
wget -q 'url' -O - | awk -F'\\\[ | \\\]\\\[' '/<title>\[/ { print $2 }'

Maar het beste is het gebruik van een parser. Helaas zijn de cli xml tools een beetje ondergeschoven.

edit: GoT eet de backslashes op, die drie backslashes achter elkaar zijn er eigenlijk twee

[ Voor 16% gewijzigd door Tim op 30-10-2010 22:17 ]


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Awk:
1
2
3
4
5
6
7
8
9
10
11
12
BEGIN {
ignore = 1;
}

/<item>/ { ignore = 0; }
/</item>/ { ignore = 1; }
/<title>/ {
if (!ignore) {
  split($0, array, "/[ | ][ | ]/")
  print array[1], array[2], array[3], array[4]
}
}


Niet getest (ben op dit moment onder vista bezig) maar deze zou elk apart onderdeel (tussen []) moeten tonen.
De ignores zijn nodig omdat in je RSS ook op andere plaatsen een <title> voorkomt.

ASSUME makes an ASS out of U and ME

Pagina: 1