Technologia Informacyjna
Transkrypt
Technologia Informacyjna
Technologia Informacyjna lista 1 Prowadzący: Mariusz Adamski Słowa kluczowe: wyrażenia regularne (regexp), Vim, sed, skrypty powłoki (shell scripting), XML, GPX Celem tej listy jest nauczenie studentów rozwiązywania problemów przy pomocy skryptów powłoki oraz wyrażeń regularnych. Podczas zajęć, każdy student napisze skrypt, który zmniejszy o rząd wielkości właściwość <hdop> wszystkich punktów GPS, zawartych w plikach GPX, podanych jako argument. 1 Praca przy użyciu terminala (konsoli) 1. Uruchom terminal; w środowisku KDE możesz to zrobić stosując kombinację klawiszową <Alt-F2> i wpisując “konsole<Enter>”. 2. Przejdź do katalogu domowego, wpisując “cd ∼<Enter>”, a następnie utwórz swój katalog roboczy poprzez “mkdir nazwa<Enter>”. Wskazówka: Możesz zawsze dowiedzieć się co robi wybrana komenda korzystając z podręcznika man, wpisując “man komenda”. Z podręcznika wychodzi się klawiszem <q>. 3. Przejdź do swojego katalogu poleceniem “cd”, utwórz w nim katalog “lista1” i wejdź do niego. 4. Ściągnij ślady GPX poleceniem “wget http://ift.uni.wroc.pl/∼marad/stuff/tracks.tgz”. Gdy wget zakończy pobieranie, sprawdź przy pomocy polecenia “ls”, że pojawił się nowy plik. 5. Rozpakuj go poleceniem “tar -xzf tracks.tgz”. Użyj automatycznego uzupełniania – wprowadź część nazwy pliku i wciśnij <Tab>. Sprawdź znaczenie poszczególnych przełączników w podręczniku (“man tar”) lub przy użyciu “tar --help”. 6. Skopiuj jeden z plików GPX do katalogu bieżącego: “cp tracks/1.gpx .”; będzie to kopia, na której będziemy testować wyrażenia regularne. Zauważ, że separatorem katalogów jest “/”; pojedyncza kropka (“.”) oznacza katalog bieżący. 7. Wykonaj kopię zapasową całego katalogu ze śladami: “cp -r tracks tracks.bak”. Przełącznik “-r” oznacza kopiowanie rekurencyjne, tzn. wraz z całą zawartością katalogu. 2 Vim 1. Uruchom w terminalu samouczek Vima wpisując “vimtutor<Enter>” (możesz użyć automatycznego uzupełniania; w tym celu wpisz tylko “vimt” i naciśnij <Tab>). Przerób co najmniej pierwsze trzy lekcje oraz ppkt. 4.2, 4.4 i 6.4. 2. Otwórz plik do testowania wyrażeń regularnych: “vim 1.gpx”. Przejrzyj go i zapoznaj się z jego strukturą. Do testowania wyrażeń regularnych posłuży nam polecenie substitute z lekcji 4.4 samouczka Vima. 1 3. Aby dopasować dowolną cyfrę, można użyć wyrażenia “[0-9]”; wypróbuj “:%s/[0-9]/c/gc”. 4. Aby zaznaczyć, że poprzedzające wyrażenie może wystąpić wielokrotnie (być może zero razy), użyj “*”; np. “:%s/[0-9][0-9]*/liczba/gc”. 5. Niektóre znaki specjalne należy „escape’ować”, poprzedzając je znakiem “\”. Należą do nich m.in. “\”, “/”, “.” („nieescape’owana” kropka oznacza dopasowanie dowolnego znaku). Spróbuj np. “:%s/[0-9]*\.[0-9][0-9]*/liczba/gc”. 6. „Escape’owane” nawiasy (“\(” i “\)”) mogą zostać użyte do grupowania wzorców. Do grup tych można się później odnosić przy pomocy “\1”, “\2”, itd. Spróbuj zamienić części dziesiętne z całkowitymi w liczbach, stosując “:%s/\([0-9]*\)\.\([0-9][0-9]*\)/\2.\1/gc”. 7. Korzystając z powyższych reguł, skonstruuj wyrażenie regularne przesuwające przecinek (a właściwie kropkę, będącą separatorem dziesiętnym w tym przypadku) w lewo we wszystkich liczbach pomiędzy znacznikami <hdop> a </hdop>. 3 Sed 1. Do masowej konwersji posłuży nam program sed. Podstawowa składnia, której będziemy na razie używać, to “sed -e ’regexp’ plik”, gdzie “plik” oznacza plik wejściowy, a “regexp”, to wyrażenie regularne, które chcemy zastosować. 2. Wypróbuj seda z prostym wyrażeniem regularnym: “sed -e ’s/[0-9]/c/g’ 1.gpx”. Sed pracuje linia po linii na całym pliku; zauważ, że nie musimy (i nie powinniśmy) podawać mu zakresu w formie znaku “%”. Ponieważ nie pracuje on interaktywnie, flaga “c” na końcu również nie ma sensu. 3. Teraz wypróbuj seda ze swoim wyrażeniem regularnym. 4. Jeśli wszystko jest w porządku, możesz przekierować wyjście seda do pliku przy pomocy operatora “>” w taki sposób: “sed -e ’regexp’ plik > plik.out”. 4 Skrypt 1. Otwórz w Vimie plik fix.sh i przepisz następujący skrypt: #!/bin/sh echo "Witaj świecie!" Ustaw mu flagę wykonywalności: “chmod +x fix.sh”; możesz go teraz wykonać: “./fix.sh”. Magiczna linia rozpoczynająca się od “#!” („hash-bang” lub „crunch-bang”) informuje terminal przy użyciu jakiego programu ma wykonać skrypt (u nas jest to “/bin/sh”, standardowa powłoka systemowa). 2. Skryptowi można przekazać argumenty; wewnątrz niego odczytuje się je przy pomocy zmiennej “$@”. Zmodyfikuj skrypt, aby wyświetlał tą zmienną i wypróbuj “./fix.sh tracks/*.gpx”. 3. Po zmiennej “$@” można iterować pętlą for w sposób następujący: for i in "\$@"; do # ciało pętli done 2 Wewnątrz ciała pętli zmienna “$i” będzie przyjmować wartość kolejnych argumentów; zmodyfikuj swój skrypt tak, aby je wypisywał. 4. Aby otrzymać nazwę pliku wynikowego, posłużymy się poleceniem “basename”. Składnia w postaci “$(basename "$i" .gpx)” wywoła polecenie wewnątrz nawiasów i jego wynik potraktuje jako zmienną. Spróbuj w ciele pętli umieścić linię “echo $(basename "$i" .gpx)”. 5. Powyższe informacje powinny być wystarczające, aby stworzyć skrypt, który przy pomocy seda przesunie przecinek w wartościach <hdop> wszystkich plików podanych jako argumenty. Wskazówka: Jako pliku wyjściowego użyj formy “$(basename "$i" .gpx)-fixed.gpx”; w ten sposób, np. poprawiony plik 1.gpx otrzyma nazwę 1-fixed.gpx. 6. Wywołaj “./fix.sh tracks/*.gpx” i zweryfikuj, czy działa poprawnie. Wskazówki 1. Terminal, którego używamy, posiada historię poleceń. Użyj klawiszy strzałek <Góra> i <Dół>, aby po niej nawigować. Możesz również używać <Lewo>, <Prawo> aby edytować polecenie, lub <Home>, <End> aby umieścić kursor odpowiednio na początku lub końcu wprowadzanego polecenia. 2. Jeśli chcesz przejść do katalogu nadrzędnego, wpisz “cd ..”. Podwójna kropka (“..”) oznacza właśnie katalog nadrzędny. 3. Z Vima wychodzi się wpisując “:q”, lub “:q!” jeśli chcesz wymusić wyjście porzucając wszystkie zmiany. Upewnij się jednak, że jesteś w trybie normalnym; klawisz <Esc> wprowadza edytor w ten tryb. 4. Vim posiada historię poleceń „dwukropkowych”; nawiguje się nią klawiszami strzałek <Góra> i <Dół>, będąc w trybie poleceń. Klawisze <Lewo>, <Prawo>, <Home>, <End>, działają podobnie jak w terminalu. 5. Możesz korzystać ze schowka na dwa sposoby: • zaznaczając tekst myszą, a następnie klikając prawy przycisk myszy wybrać „kopiuj”/„wklej” • zaznaczając tekst, co automatycznie umieści go w schowku X i wklejając środkowym przyciskiem myszy są to dwa różne schowki. 3