Przetwarzanie plików tekstowych
Transkrypt
Przetwarzanie plików tekstowych
Przetwarzanie plików tekstowych 1 Cel zadania Opanowanie umiej˛etności posługiwania si˛e klasa˛ std::string oraz szablonem std::list<>. Utrwalenie umiej˛etności korzystania z pakietu getopt. 2 Opis zadania Należy napisać program, który umożliwi modyfikacj˛e napisu z wejścia standardowego. Wynik wykonanych działań ma być wyświetlony na wyjście standardowe. Operacje, które program powinien umożliwiać, to • usuni˛ecie zadanego tekstu z każdej linii lub wybranych linii, • zamiana zadanego tekstu z każdej linii lub wybranych linii, • wstawienie zadanego tekstu z każdej linii lub wybranych linii, • dołaczenie ˛ zadanego tekstu na koniec wybranej linii lub wszystkich linii. Ponadto program powinien potrafić uporzadkować ˛ wszystkie linie alfabetycznie lub wyświetlić w porzadku ˛ odwrotnym. 3 Specyfikacja wywołania programu Program ma podjać ˛ odpowiednie działania zdefiniowane poprzez opcje jego wywołania. Tak wi˛ec program nie ma dostarczać żadnego interfejsu użytkownika do pracy interaktywnej. Niektóre elementy składni poleceń nawiazuj ˛ a˛ do składni poleceń dla programu sed. W dalszej cz˛eści opisu dla ustalenia uwagi zakłada si˛e, że program realizujacy ˛ niniejsze zadanie nazywa si˛e ptekst (przetwórz tekst). Składnia wywołania programu przedstawiona została poniżej. Zapisana ona została w notacji MBNF. ptekst ( -p ’[adres] polecenie’ {-p ’[adres] polecenie’ } ) | [ -s | -r | -h ] Po opcji -p wyst˛epuje napis b˛edacy ˛ poleceniem. Opcja -s ma spowodować posortowanie alfabetyczne wszystkich linii w pliku, zas opcja -r ma pozwolić na realizacj˛e sortowania w porzadku ˛ odwrotnym. Opcja -h powinna spowodować wyświetlenie krótkiej informacji o sobie oraz składni˛e wywołania. Jeżeli program zostanie wywołany bez żadnej opcji, to powinien czytać wejście standardowe i kopiować je na wyjście standardowe bez żadnych zmian. Program powinien kontrolować poprawność składni wywołania, np. powinien zasygnalizować bład ˛ jeśli użyta zostanie jednocześnie opcja -s oraz -h. Obsługa opcji wywołania programu powinna zostać wykonana z wykorzystaniem pakietu getopt. Przykłady jego użycia można znaleźć w katalogu: ~bk/edu/po/zad/z7/getopt 3.1 Zakres stosowalności polecenia – adres Opcjonalnie przed poleceniem może wystapić ˛ adres określajacy ˛ linie tekstu, do których dane polecenie stosuje si˛e. Brak adresu oznacza, że polecenie ma być zastosowane do każdej linii. Adres może być podany w postaci numeru pojedynczej linii, np. 41. Może on też określać pewien przedział linii, np. 41,61 ( linie od 41 do 61 włacznie). ˛ Zakłada si˛e, że linie w pliku numerowane sa˛ od 0. 1 3.2 Opis poleceń Ogólna postać polecenia to x/pierwszy_argument/drugi_argument/zakres gdzie x — litera symbolizujaca ˛ dana˛ operacj˛e, pierwszy_argument — pierwszy argument danej operacji, drugi_argument — drugi argument danej operacji, zakres — liczba określajaca ˛ maksymalna˛ ilość egzekucji danego polecenia w pojedynczej linii. W dalszej cz˛eści opisane zostały poszczególne polecenia. i/nr_kol/wstawiany_tekst/ – wstawia tekst w zadanej kolumnie, przykład wywołania: ptekst -p ’i/10/nowy tekst/’ Wynik działania: w każdej linii w kolumnie o nr 10 wstawiony zostaje tekst ”nowy tekst”. a/tekst_dostawiany/ – dołacza ˛ tekst na koniec linii, przykład wywołania: ptekst -p ’a/to juz koniec/’ Wynik działania: na koniec każdej linii dodany zostanie tekst ”to juz koniec”. s/tekst_do_zmiany/nowy_tekst/{ilosc} – zamienia ”tekst_do_zamiany” na tekst ”nowy_tekst”. Parametr ilosc określa maksymalna˛ ilość dokonanych zamian w linii. Oznacza to, że jeżeli ilosc=4, a tekst ”tekst_do_zamiany” wyst˛epuje 6 razy w w danej linii, to dla 4 pierwszych jego wystapień ˛ zostanie dokonana zamiana. Jeżeli tekst ten wyst˛epuje 3 raz w linii, to dla wszystkich jego wystapień ˛ zostanie zrealizowana zamiana. Jeżeli w poleceniu nie pojawi si˛e parametr ilość, to przyjmuje si˛e, że domyślnie ma on wartość 1. f/tekst_do_znalezienia/{ilosc} – wyświetla linie, w której wyst˛epuje dany tekst. Znaczenie parametru ilosc jest analogiczne jak dla polecenia zamiany. W tym przypadku określa on maksymalna˛ ilość wystapień ˛ danego tekstu w linii, dla którego zostanie wykonana operacja zaznaczenia. Jeżeli w poleceniu nie pojawi si˛e parametr ilość, to przyjmuje si˛e, że domyślnie ma on wartość 1. Przykład wywołania: echo "Jak dobrze wstać skoro świt" | ptekst -p ’f/dobrze/1/’ Wynik działania: Jak dobrze wstać skoro świt ^^^^^^ ˛ od kolumny nr_kol_o do nr_kol_n. d/nr_kol_o/nr_kol_n/ – usuwa tekst poczawszy Kolumny numerowane sa˛ od 0. 2 4 Przykład działania programu jkowalsk@panamint: rozwiazanie> cat plik.txt # Wyswietlenie pliku Tulipan do rozy: - Rozo, kochasz mnie? - Kocham cie, tulipanie, bardzo. - Czy pragniesz mnie, rozo? - Pragne cie tak bardzo, ze o niczym innym nie moge myslec. - Do diabla, kiedy te pszczoly wreszcie przyleca!!! jkowalsk@panamint: rozwiazanie> ptekst -p ’3,5 s/-/*/’ -p ’s/?/????/’ < plik.txt Tulipan do rozy: - Rozo, kochasz mnie???? * Kocham cie, tulipanie, bardzo. * Czy pragniesz mnie, rozo???? * Pragne cie tak bardzo, ze o niczym innym nie moge myslec. - Do diabla, kiedy te pszczoly wreszcie przyleca!!! jkowalsk@panamint: rozwiazanie> _ 5 Rozszerzenie (nieobowiazkowe) ˛ 1. W poleceniach zamiany (s) i wyszukiwania (f) powinno w miejscu odpowiednio "tekst_do_zamiany" i "tekst_do_znalezienia" być możliwe użycie wyrażenia regularnego poprzez wykorzystanie pakietu regex. Przykład jego użycia znajduje si˛e w kartotece b̃k/edu/po/zad/z7/regex. 2. Budowa adresu określajaca ˛ miejsce stosowalności polecenia powinna uwzgl˛edniać rozszerzona˛ składni˛e zapewniajac ˛ a˛ podanie jednocześnie kilku przedziałów wg wzoru adres = nr_wiersza0,nr_wiersza1 { :nr_wiersza,nr_wiersza } Zakłada si˛e, że przedziały nie musza˛ być podane w sposób uporzadkowany. ˛ Nie moga˛ jednak jednak wzajemnie nakładać si˛e. Przykład wywołania: ptest -p ’4,10:40,45:21,25 s/xxxx/yyyy/’ Zakłada si˛e, że niezależnie od podanej kolejności w adresie, linie tekstu zawsze przetwarzane sa˛ jedna po drugiej. ˛ a˛ sortowanie tekstu poprzez wskazanie 3. Należy dodać dodatkowa˛ opcj˛e -S umożliwiajac podciagów, ˛ które b˛eda˛ stanowiły klucz sortowania. Wskazanie to należy zrealizować w oparciu o adres opisany we wcześniejszym punkcie. Zakład si˛e, że użycie opcji -S wyklucza użycie jakiejkolwiek innej opcji. Przykład wywołania: ptest -S ’7,9:3,5’ Dla przykładowego pliku o zawartości: 3 - Prosze wode mineralna, ale bez soku. - Bez jakiego soku? - Wszystko jedno, moze byc bez malinowego. Wybrany klucz do sortowania b˛edzie miał, dla każdej z tych linii, postać: e wros akiez tkoszy W przypadku, gdy podany przedział wypada poza lini˛e, to przyjmuje si˛e, że jego zawartościa˛ jest napis pusty. 4. Znak separacji argumentów polecenia nie powinien być ograniczony do znaku ’/’. Zakłada si˛e, że pierwszy znak użyty po znaku polecenia staje si˛e znakiem separacji argumentów. Przykłady wywołań z wykorzystaniem różnych separatorów: ptekst -p ’s|tekst do zamiany|nowy tekst|’ ptekst -p ’s;tekst do zamiany;nowy tekst;’ ptekst -p ’s tekst_do_zamiany nowy_tekst ’ 6 Informacje dodatkowe Operacje, które ma wykonać program b˛edacy ˛ rozwiazaniem ˛ niniejszego zadania, sa˛ zbliżone do tych jakie wykonywane sa˛ przez programy narz˛edziowe w systemie Unix/Linux. Programy te to: sed, grep, sort. Opis wymienionych programów dost˛epny jest na stronach podr˛ecznika systemowego np. man sort. Wspomniane programy sa˛ jednymi z najbardziej użytecznych i najcz˛eściej używanych narz˛edzi wykorzystywanych przy pisaniu skryptów systemowych i nie tylko. 4