1. Wykorzystując program tr napisz skrypt-filtr zamieniający wszystkie wielkie litery na małe, a znaki nie będące znakami alfanumerycznymi na znaki podkreślenia. Użyj POSIX-owych klas znaków, aby uzyskać prawidłową zamianę dla polskich liter włącznie z ż, ź, Ż, Ź, itp. Uwaga: można napisać dwa oddzielne wywołania tr-a w potoku.

  2. Wykorzystaj powyższy filtr do napisania skryptu, ktory odwiedzi wszystkie podkatalogi bieżącego katalogu (lub dowolnego zadanego) i zamieni w nazwach plików i katalogów wielkie litery na małe. Wskazówka: napisz operację zmiany nazwy jako funkcję i użyj jej wewnątrz programu find, który domyślnie przetwarza całe drzewo katalogów. Alternatywnie, napisz rekurencyjną funkcję, która będzie to robić, wykorzystaj pętle for i in *. Zwróć uwagę na możliwe spacje w nazwach plików i katalogów!

  3. Używając polecenia grep sprawdź, jakie litery dopasowywane są do wyrażenia regularnego [a-e] jeśli bieżące locale ustawione jest na POSIX, a jakie w przypadku pl_PL. Jakie litery są dopasowywane do wzorca [a-E]? Wyniki swoich eksperymentów zweryfikuj czytając man-a.

  4. Plik zawiera listę studentów w postaci:

    Imię/Imiona Nazwisko Numer

    Wszystkie pola są oddzielone spacjami. Imiona i nazwiska zawierają tylko litery (małe i wielkie), natomiast numer studenta jest ciągiem cyfr. Problem w tym, że niektórzy studenci mają jedno imię, a niektórzy dwa imiona.

    (a) Napisz skrypt seda zamieniający listę w powyższym formacie na listę CSV, to znaczy separatorami pól mają być przecinki zamiast spacji. Jednak spacje powinny pozostać pomiędzy imionami, gdy są dwa.

    Napisz skrypt seda jako plik wykonywalny, wykorzystując mechanizm #!. To znaczy, skrypt powinien zawierać tylko polecenia seda, aby można go było wywołać w postaci sed -f skrypt.sed, ale również dzięki mechanizmowi #! aby możliwe było wywołanie ./skrypt.sed.

    Po napisaniu i uruchomieniu skryptu zastanów się, czy jest on możliwie prosty, a jednocześnie niezawodny. Na przykład, odpowiedz, czy zadziała on równie poprawnie jeśli: (b) imion będzie więcej niż dwa, (c) po numerze studenta w wierszu mogą wystąpić jeszcze inne informacje?

  5. Rozważ instrukcję pętli shella, która zamieni nazwy wszystkich plików w katalogu bieżącym mających w nazwie spacje na podkreślenia. Sekwencje kilku spacji powinny być zamienione na pojedynczy znak podkreślenia.

    Napisz dwie wersje takiej instrukcji wykorzystujące do skonstruowania nowych nazw plików alternatywnie tr i seda.

    Opracowane polecenia wklej do raportu z wykonania zadania.

  6. Napisz instrukcję przypisania shella, które wywołując seda jako polecenie zagnieżdżone zmodyfikuje bieżące ustawienie ścieżki PATH w taki sposób, aby usunąć z niej katalogi "/usr/games" i "."

    To znaczy, jeśli przykładowo wartość PATH wynosiła:

    PATH=/usr/bin:/bin:/usr/games:.
    
    to wynikiem wykonania instrukcji powinno być:
    PATH=/usr/bin:/bin
    

    Opracowaną instrukcję przetestuj w różnych przypadkach. Sprawdź czy działa poprawnie niezależnie od tego, czy dowolny z podanych katalogów znajdował się w ustawieniu ścieżki, czy nie. Oczywiście nie chcielibyśmy, aby po wykonaniu naszej instrukcji, w ścieżce pozostały dziwactwa takie jak: :: (aczkolwiek nie generują one błędów).

    Wariant trudniejszy: sprawdź czy Twoja instrukcja zadziała poprawnie niezależnie od tego, które z następujących form podanych katalogów znajdą się w ścieżce: "/usr/games" "/usr/games/" "." "./"
    Spróbuj napisać możliwie najkrótsze wyrażenie seda, które zadziała poprawnie w każdym przypadku.

    Opracowane polecenie wklej do raportu z wykonania zadania.

  7. Plik zawiera listę studentów z wynikami ćwiczeń w formacie:

    Imię_1 Nazwisko_1 Numer_1 wynik_1
    Imię_2 Nazwisko_2 Numer_2 wynik_2
    Imię_3 Nazwisko_3 Numer_3 wynik_3
    ...
    

    Może występować wiele wyników dla każdego studenta. Napisz skrypt w awk-u obliczający i wyświetlający na wyjściu dla każdego studenta: imię, nazwisko, numer, liczbę znalezionych wyników, wynik sumaryczny, wynik średni, oraz wynik średni obliczony z pominięciem najniższego i najwyższego.

  8. Plik zawiera listę studentów w formacie:

    Imię_1 Nazwisko_1 Numer_1 inne informacje ...
    Imię_2 Nazwisko_2 Numer_2 inne informacje ...
    Imię_3 Nazwisko_3 Numer_3 inne informacje ...
    ...
    

    Napisz skrypt w awk-u sprawdzający, czy wszystkie wiersze zawierające ten sam numer w polu 3 mają dokładnie to samo imię i nazwisko w polach 1 i 2. Na wyjściu należy wyświetlić wszystkie wiersze z wejścia (bez zmian), oraz dodatkowy komunikat dla każdego wiersza, który zawiera numer, który wcześniej wystąpił z innym imieniem i/lub nazwiskiem.

  9. [zadanie dodatkowe - opcjonalne] Napisz skrypt awk do generowania indeksu tekstu wejściowego. Indeksem będzie lista słów, po jednym w wierszu, z listą numerów wierszy tekstu wejściowego, w których słowo wystąpiło. Skrypt powinien być plikiem z czystym kodem awk, wykonywalnym dzięki mechanizmowi #!. Spowoduje to generowanie na wyjściu indeksu nieposortowanego. Akceptujemy to, pozostawiając kwestię sortowania indeksu (oraz ewentualnego formatowania go według potrzeb) aplikacji która go wywoła.

    Podobnie, ignorujemy występowanie znaków interpunkcji w tekście źródłowym. Jeśli pojawiają się w nim konstrukcje typu:

    Podczas kolacji przemawiali:mama,tata,wuja.
    
    to można odpowiednio odfiltrować znaki interpunkcji filtrami zewnętrznymi, aby indeks zbudował się wyłącznie dla słów.

    (a) W najprostszej wersji, chcemy uzyskać listę numerów wierszy oddzielonych przecinkami, np.:

    mama - 1,1,2,3,3,4,5,5,10,18,19,22,25,35
    tata - 1,1,3,3,5,5,6,6,7,7,8,13,23,44
    wuja - 11,12,17,27,29,39
    

    (b) Wersja trudniejsza: należy dodać dwie poprawki. (1) Jeśli słowo występuje w kolejnych wierszach, to zamiast listy poszczególnych wierszy, w indeksie powinny pojawić się przedziały. (2) Jeśli słowo występuje wiele razy w jednym wierszu, to numer wiersza nie powinien się powtarzać, tylko powinien być zaznaczony gwiazdką. Jeśli dany numer wiersza podpada pod oba przypadki (1) i (2), to należy uwzględnić tylko (1), np.:

    mama - 1-5,10,18-19,22,25,35
    tata - 1*,3*,5-8,13,23,44
    wuja - 11-12,17,27,29,39