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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2010-12-15 11:16:48

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

Regex, jak to ugryźć?

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:

Kod:

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)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#2  2010-12-15 11:53:41

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Regex, jak to ugryźć?

spróbuj za pomocą redet


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#3  2010-12-15 12:42:01

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

Re: Regex, jak to ugryźć?

A nie wiesz przypadkiem (to jest największy kłopot), jak w zwykłym perlu z wyrażenia

Kod:

jeden dwa trzy cztery

wyciąć środek, żeby zostało

Kod:

jeden cztery

W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#4  2010-12-15 13:00:47

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Regex, jak to ugryźć?

w perlu nie wiem, ale:

Kod:

azhag@laptop /tmp % echo jeden dwa trzy cztery | sed -re "s/(.*) (.*) (.*) (.*)/\1 \4/g"
jeden cztery

Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#5  2010-12-15 13:06:07

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

Re: Regex, jak to ugryźć?

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)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#6  2010-12-15 18:37:36

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: Regex, jak to ugryźć?

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:

Kod:

#--------------------------------------------------
# &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ę:

Kod:

%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

 

#7  2011-03-03 09:03:39

  rodiavel - Nowy użytkownik

rodiavel
Nowy użytkownik
Zarejestrowany: 2011-03-03

Re: Regex, jak to ugryźć?

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 cztery

wyciąć ś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

 

#8  2011-03-03 09:32:36

  rodiavel - Nowy użytkownik

rodiavel
Nowy użytkownik
Zarejestrowany: 2011-03-03

Re: Regex, jak to ugryźć?

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 more

Chodzi 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 -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
;-)

a może tak :)

s/\[i\] (.*?)\n(?:.|\n)*\)\((.*?)\)(?:.|\n)*/\1 \2/m

Ostatnio edytowany przez rodiavel (2011-03-03 09:58:05)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)