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