Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam
Troszkę doświadczenia z regexem - w perlu, już złapałem, głównie dzieki Ludziom z DUGa :).
Ale tu mam przykład o wiele za wysoki, jak na moje umiejętności.
Posłużę się przykładem z Gentoo, lecz nie jest on przedmiotem zagadnienia, a jedynie kawałkiem tekstu, który ma zobrazować to zagadnienie:
Czyli przekształcić ciąg znaków:
[i] app-portage/eix
Available versions: 0.17.0 0.19.2 0.20.5 (~)0.22.4 (~)0.22.5{tbz2} {+bzip2 debug +deprecated doc hardened nls optimization sqlite strong-optimization tools}
Installed versions: 0.22.5{tbz2}(01:43:45 05.12.2010)(bzip2 hardened nls optimization sqlite strong-optimization tools -debug -doc)
Homepage: http://eix.berlios.de
Description: Search and query ebuilds, portage incl. local settings, ext. overlays, version changes, and more
Chodzi mi o to, żeby powstał z tego ciąg w takiej postaci:
app-portage/eix bzip2 hardened nls optimization sqlite strong-optimization tools -debug -doc
Czyli pozostały tylko wytłuszczone powyżej elementy.
Największy kłopot mam z usunięciem środkowej części (na przykładzie pomiędzy Available a Installed **\()
Dzięki i Pozdrawiam
;-)
Ostatnio edytowany przez Jacekalex (2010-12-15 11:20:29)
Offline
spróbuj za pomocą redet
Offline
A nie wiesz przypadkiem (to jest największy kłopot), jak w zwykłym perlu z wyrażenia
jeden dwa trzy cztery
wyciąć środek, żeby zostało
jeden cztery
Offline
w perlu nie wiem, ale:
azhag@laptop /tmp % echo jeden dwa trzy cztery | sed -re "s/(.*) (.*) (.*) (.*)/\1 \4/g" jeden cztery
Offline
Dzięki, coś pokombinuje dalej, a co do redet, - to na wiki piszą, że bash ma wbudowaną pełną obsługę regexu.
Ostatnio edytowany przez Jacekalex (2010-12-15 19:18:11)
Offline
W perl-u przy pomocy backticków przechwyć wyjście odpowiedniego polecenia (albo otwórz dany plik, nie wiem na czym operujesz) a następnie iteruj po każdym kolejnym wierszu. Brak słowa kluczowego będzie oznaczał nazwę klucza w tablicy asocjacyjnej, zaś wartością będzie kolejna tablica asocjacyjna zawierająca odpowiednie nazwy kluczy oraz odpowiadające im wartości.
Dla przykładu ja mam taki kod do przetwarzania netrc:
#-------------------------------------------------- # &parse_netrc() # return %netrc( hostname => { # login => \$scalar, # password => \$scalar # } ) # NOTE: it relays on HOME environment variable. In some cases it may not be set. #-------------------------------------------------- sub parse_netrc { my $netrc_file = $ENV{'HOME'} . "/.netrc"; my %netrc; my $machine; my $login; my $password; open FILE, '<' . $netrc_file or die "Could not open $netrc_file for reading: $! \n"; while (<FILE>) { chomp; # gets rid of newline if (/machine/i) { $machine = substr($_, 8); $netrc{$machine} = {}; } if (/login/i) { $netrc{$machine}->{'login'} = substr($_, 6); } if (/password/i) { $netrc{$machine}->{'password'} = substr($_, 9); } } close FILE; return %netrc; }
Potem konkretne wartości otrzymujesz przez konstrukcję:
%netrc = &parse_netrc(); $netrc{$machine}->{'login'} # np.: $netrc{'app-portage/eix'}->{'installed-use'}
W ten sposób możesz sobie napisać ogólny silnik do przetwarzania tej struktury a potem wypisywać adresy stron domowych, możliwe flagi USE, użyte flagi USE itd.
Ale zanim się do tego zabierzesz, pomyśl czy Gentoo nie przechowuje gdzieś tych danych w formacie bardziej przyjaznym maszynom (bo wątpię żeby to co podałeś było jedynym miejscem skąd można wyciągnąć te informacje).
Offline
Jacekalex napisał(-a):
A nie wiesz przypadkiem (to jest największy kłopot), jak w zwykłym perlu z wyrażenia
Kod:
jeden dwa trzy czterywyciąć środek, żeby zostało
Kod:
jeden cztery
np. tak :)
s/\b(.+?)\b(?:[^\b]+)\b(.+?)\b/\1 \2/
albo prościej
s/(\s.*\s)/ /
Ostatnio edytowany przez rodiavel (2011-03-06 18:33:10)
Offline
Jacekalex napisał(-a):
Witam
Troszkę doświadczenia z regexem - w perlu, już złapałem, głównie dzieki Ludziom z DUGa :).
Ale tu mam przykład o wiele za wysoki, jak na moje umiejętności.
Posłużę się przykładem z Gentoo, lecz nie jest on przedmiotem zagadnienia, a jedynie kawałkiem tekstu, który ma zobrazować to zagadnienie:
Czyli przekształcić ciąg znaków:[i] app-portage/eix
Available versions: 0.17.0 0.19.2 0.20.5 (~)0.22.4 (~)0.22.5{tbz2} {+bzip2 debug +deprecated doc hardened nls optimization sqlite strong-optimization tools}
Installed versions: 0.22.5{tbz2}(01:43:45 05.12.2010)(bzip2 hardened nls optimization sqlite strong-optimization tools -debug -doc)
Homepage: http://eix.berlios.de
Description: Search and query ebuilds, portage incl. local settings, ext. overlays, version changes, and moreChodzi mi o to, żeby powstał z tego ciąg w takiej postaci:
Kod:
app-portage/eix bzip2 hardened nls optimization sqlite strong-optimization tools -debug -docCzyli pozostały tylko wytłuszczone powyżej elementy.
Największy kłopot mam z usunięciem środkowej części (na przykładzie pomiędzy Available a Installed **\()
Dzięki i Pozdrawiam
;-)
a może tak :)
s/\[i\] (.*?)\n(?:.|\n)*\)\((.*?)\)(?:.|\n)*/\1 \2/m
Ostatnio edytowany przez rodiavel (2011-03-03 09:58:05)
Offline