[solved] sed i kasowanie textu z linii

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
Tares
Sędziwy Jeż
Sędziwy Jeż
Posty: 55
Rejestracja: 05 maja 2006, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: Unity
Architektura: x86_64
Kontakt:

[solved] sed i kasowanie textu z linii

Post 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 ;-)
^_^;
Awatar użytkownika
NoName_1990
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 28 lut 2007, 18:01
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Inne
Architektura: x86

Odp: sed i kasowanie textu z linii

Post 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)
Awatar użytkownika
Tares
Sędziwy Jeż
Sędziwy Jeż
Posty: 55
Rejestracja: 05 maja 2006, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: Unity
Architektura: x86_64
Kontakt:

Odp: sed i kasowanie textu z linii

Post 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.
^_^;
azia3
Piegowaty Guziec
Piegowaty Guziec
Posty: 1
Rejestracja: 13 sty 2010, 22:22
Płeć: Kobieta
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: [solved] sed i kasowanie textu z linii

Post 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.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 9 gości