Strona 1 z 1

[solved] sed i kasowanie textu z linii

: 22 lip 2009, 18:17
autor: Tares
witam,

ostatnio z okazji zmiany pulpitu ( :D ) postanowiłem trochę rozszerzyć funkcjonalność mojego conky'ego. W tym celu zabrałem się za napisanie skryptu w bashu, który będzie mi pobierał listę tytułów anime z stronki http://animecalendar.net. Niestety stronka nie ma RSS'a do tego, więc trzeba było stworzyć jako taki parser. Jedynymi narzędziami do tego jakie znam (w sensie, że słyszałem, że są) to awk i sed, ale z drugiego już korzystałem, więc wybór był oczywisty ;-) jakby jednak ktoś miał jeszcze coś innego, ciekawszego to chętnie spróbuje.

W każdym bądź razie, trzeba przejść do sedna ;-) W chwili obecnej stworzyłem takiego skrypta :

Kod: Zaznacz cały

#!/bin/bash

web=http://animecalendar.net/
dzien=$(date +%d)

#print lines between $dzien and $dzien+1
curl $web | sed -n "/>$dzien</,/>$(($dzien+1))</p" | \
#delete whitespace at beginning and ending of the line
sed 's/^[ \t]*//;s/[ \t]*$//' | \
#delete last line
sed '$d' | \
#strip file from html tags
sed -e 's#<[^>]*>##g' | \
#delete line with matching pattern=src
sed '/src/d' | \
#delete blank/empty lines
sed '/./!d' | \
#delete first two lines
sed '1,2d' | \
#add white line when pattern is matched
sed '/>/G' | \
#print only lines with more than 2 chars
sed -n '/^.\{2\}/p'

exit
Wiem, że obecny skrypt, nie jest idealny i się wysypie przy 30/31 dniu miesiąca, ale tym się będę bawił, jak już wszystko będzie działać ;-) sama stronka nie jest zbyt idealnie napisana, więc trochę więcej z nią problemów było niż mi się wydawało, ale dzięki temu co napisałem otrzymuję taki wynik :
Spice and Wolf II   00:00 TV Kanagawa   " style="color: #fff; font-size:10px;" target="_blank" id="font_4873_3">Spice and Wolf II
Ep: 3
Sweet Blue Flowers   Fumi Manjoume, an introverted... [ciach] ...other get through them.00:00 Fuji TV   " style="color: #fff; font-size:10px;" target="_blank" id="font_4720_4">Sweet Blue Flowers
Ep: 4
Umi Monogatari ~Anata ga Ite Kureta Koto~   The story centers on Marin and Urin ... [ciach] ... by an enveloping darkness.00:00 CBC    " style="color: #fff; font-size:10px;" target="_blank" id="font_5110_5">Umi Monogatari ~Anata ga Ite Kureta Koto~
Ep: 5
Umineko no Naku Koro ni   Umineko no Naku Koro ni takes place ...[ciach] ... murdered.00:00 Chiba TV   " style="color: #fff; font-size:10px;" target="_blank" id="font_4742_4">Umineko no Naku Koro ni
Ep: 4
Pod ciachem kryje się sam text, nic za co by się można było zaczepić, więc nie potrzebny jest w ogóle.

W sumie to już chyba niedaleka droga ;-) w porównaniu do tego co było na początku ;-) W każdym bądź razie, chciałbym, żeby efekt końcowy wyglądał tak :

Kod: Zaznacz cały

Spice and Wolf II
Ep: 3
Sweet Blue Flowers
Ep: 4
Umi Monogatari ~Anata ga Ite Kureta Koto~
Ep: 5
Umineko no Naku Koro ni
Ep: 4
Jednak tutaj pojawia się problem, ponieważ nie potrafię za pomocą sed'a wyłuskać coś z linii. Sposoby widzę dwa, albo przeczytać początkowe znaki do   i reszte cropnąć lub cropnąć wszystko do napotkania znaku ">". Z tutoriali, z których korzystałem, nie wiele było wydobywaniu textu z linii.

Byłbym wdzięczny jakby ktoś podrzucił pomysł lub wskazał mi chociaż kierunek ;-)

Odp: sed i kasowanie textu z linii

: 22 lip 2009, 20:23
autor: NoName_1990
Tares pisze:albo przeczytać początkowe znaki do   i reszte cropnąć

Kod: Zaznacz cały

sed -e 's/\&nbsp.*//'
Tares pisze: lub cropnąć wszystko do napotkania znaku ">".

Kod: Zaznacz cały

sed -e 's/.*>//'
Ogólnie to polecam man 1 sed a konkretnie tą część o s (zamiana na podstawie wyrażeń regularnych)

Odp: sed i kasowanie textu z linii

: 22 lip 2009, 20:52
autor: Tares
NoName_1990 pisze:

Kod: Zaznacz cały

sed -e 's/\&nbsp.*//'

Kod: Zaznacz cały

sed -e 's/.*>//'
Ogólnie to polecam man 1 sed a konkretnie tą część o s (zamiana na podstawie wyrażeń regularnych)
Dzięki. Oba działają. Co do komentarza... to gdybym na podstawie man'a potrafił zrobić to co napisałeś wyżej, to bym nie pisał posta na forum.

Odp: [solved] sed i kasowanie textu z linii

: 13 sty 2010, 22:38
autor: azia3
żeby nie tworzyć nowego tematu to zapytam się tutaj. Mam napisać w sedzie skrypt konwertujący stronę html na tekst z tagami ubb. skrypt powinien obsługiwać kody ubb: , , , [email], [url], [img]. jak na razie wygląda on tak:

#!/bin/sed -nf
1,/<\/head>/d
s/<\/body>.*//g
s/["?]//g
s/jpg[^>]*>/jpg\[\/img]/g
s/img[^=]*=/img]/g
s/
/\n/g
s/\/a>/\/url]/g
/mailto/s/\/url]/\/email]/g
s/a href=mailto:/email=/g
s/a href[^=]*=/url=/g
s/</\[/g
s/>/]/g
/\\|\\|\\|\[url\|\[img]\|\[email/p

i teraz nie wiem jak zrobić żeby wyciąć w linii tekst który występuje poza tagami które mam obsłużyć. będę wdzięczna za wszystkie sugestie.