Środowisko programisty Zestaw 4

Podobne dokumenty
Wyrażenia regularne. Wyrażenia regularne 1/41

SED - Stream EDitor. edytor strumieniowy. Bogumił Konopka W-11/I-21 Politechnika Wrocławska

Przedstawię teraz tzw. podstawowe symbole wyrażenia regularne (BRE, Basic Regular Expression)

2.6 Edytor sed (Stream Editor)

Wstęp do informatyki 2011/2012. Wyrażenia regularne (sed)

System operacyjny Linux

Przetwarzanie tekstu 2. Operacje na plikach tekstowych w systemie Linux

Wstęp do Informatyki dla bioinformatyków

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Systemy operacyjne 12

Środowisko programisty Zestaw 5

EDYTOR TEKSTOWY VIM WYBRANE POLECENIA. Pracownia Informatyczna 5

System operacyjny Linux

JĘZYK SHELL JEST PEŁNYM JĘZYKIEM PROGRAMOWANIA

Zakład Systemów Rozproszonych

Skrypty powłoki Skrypty Najcz ciej u ywane polecenia w skryptach:

J ezyk AWK Kurs systemu UNIX

1 Przygotował: mgr inż. Maciej Lasota

Wstęp do informatyki. stęp do informatyki Polecenia (cz.2)

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

1. Wyrażenia regularne. Symbole w wyrażeniach regularnych 1 :

Środowisko programisty Zestaw 7

Przekierowanie wejścia wyjścia:

Języki formalne i automaty Ćwiczenia 6

1. Wprowadzanie danych z klawiatury funkcja scanf

Skrypty powłoki w systemie Linux

Trochę o plikach wsadowych (Windows)

Skrypty BASH a. Systemy Operacyjne 2. Mateusz Hołenko. 4 października 2012

Krok po kroku... (czyli jak stworzyć i wydrukować krzyżówkę)

Wybrane zmiany wprowadzone w pakiecie Oprogramowanie: SyriuszStd

Powłoka I. Popularne implementacje. W stylu sh (powłoki zdefiniowanej w POSIX) W stylu csh. bash (najpopularniejsza) zsh ksh mksh.

Podstawy Kompilatorów

Temat zajęć: Filtry, strumienie standardowe oraz przetwarzanie potokowe. stderr

Administracja sieciowymi systemami operacyjnymi III Klasa - Linux

Zastosowanie filtrów w Linuksie

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Python jest interpreterem poleceń. Mamy dwie możliwości wydawania owych poleceń:

Ćwiczenie: JavaScript Cookies (3x45 minut)

Operatory d - kasuj (do bufora tymczasowego) c - zmień y - zapamiętaj (yank) > - przesuń w prawo < - przesuń w lewo. Informatyka MPDI2. np.

Kompilator języka Basic można bezpłatnie pobrać ze strony z zakładki DOWNLOAD.

Skanowanie OCR w aplikacji Kancelaria Komornika. Instrukcja dla użytkownika

Podstawy bioinformatyki 2017/18

vi - Edytor tekstu. 1. To, co każdy powinien wiedzieć o vi!!!

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Linux Filtr grep. Opracował: Arkadiusz Curulak WSIiE TWP w Olsztynie

Systemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Funkcje standardowe. Filtrowanie

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Opis klawiatury komputerowej

Powłoka bash. Kurs systemu Unix 1

trainxx tramxx

skrypt powłoki to plik tekstowy, rozpoczynający się sekwencją: pierwsza linia określa powłokę, w której wykonywany jest skrypt; druga to komentarz

Linux Polecenia. Problem nadpisywania plików. Zmienna noclobber i noglob. Filtry i metaznaki. Problem nadpisywania plików. Opracował: Andrzej Nowak

media Blitz wydajne sytemy szablonów

Skrypty startowe. Tryb interaktywny tryb logowania: nie logowanie: Tryb nieinteraktywny

Znaki globalne w Linuxie

Technologie informacyjne: Arkusz kalkulacyjny

Laboratorium Systemów Operacyjnych Komputerów Tryb linii komend i programowanie wsadowe w systemach DOS/Windows

Język Python (2) Język Python (2) 1/36

Projektowanie aplikacji internetowych Pisanie skryptów wiersza poleceń - pętle

Ćwiczenie 5 Menu programu

Zasady programowania Dokumentacja

POPULARNE POLECENIA SKRYPTY. Pracownia Informatyczna 2

System operacyjny UNIX Ćwiczenie 1. Podstawowe polecenia systemu Unix

Sieci i systemy operacyjne I Ćwiczenie 1. Podstawowe polecenia systemu Unix

Instrukcja programu mam wersja 1.02.

Powłoka (shell) Powłoka ksh

Technologie Informacyjne - Linux 2

Wstęp do programowania

Wyrażenia regularne w Perlu. Narzędzia informatyczne w językoznawstwie. Przykład bardziej sensowny perlowy minigrep.pl. Pierwsze przykłady

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Użycie Visual Basic for Applications ("VBA")

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

ECDL/ICDL Przetwarzanie tekstów Moduł B3 Sylabus - wersja 5.0

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Wstęp do programowania

Matematyczne Podstawy Informatyki

Wstęp do programowania. Wykład 1

OPCJE -A num, --after-context=num Wypisuje po pasujących liniach num linii następującego kontekstu.

Wstęp do programowania 2

Różne pożyteczne polecenia oraz wyrażenia regularne. Kurs systemu Unix 1

II. Programowanie wsadowe DOS/Windows

SQL 4 Structured Query Lenguage

XQuery. sobota, 17 grudnia 11

Procedury i funkcje składowane

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

pico mojskrypt bash mojskrypt chmod +x mojskrypt./mojskrypt

Wykład 4. Środowisko programistyczne

PODSTAWY INFORMATYKI

dr inż. Jarosław Forenc

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Prawa dostępu do plików (1)

USB firmware changing guide. Zmiana oprogramowania za przy użyciu połączenia USB. Changelog / Lista Zmian

Programowanie w Ruby

Pliki. Informacje ogólne. Obsługa plików w języku C

Programowanie strukturalne

1. Znajdź za pomocą programu locate wszystkie pliki które zawierają w nazwie słowo netscape locate netscape

Cele. Definiowanie wyzwalaczy

Obsługa blędów i zewnętrznych plików

Transkrypt:

sed uniwersalny edytor strumieniowy sed to edytor strumieniowy (stream editor) zawarty w systemach uniksowych, służący do przetwarzania plików tekstowych. Jego funkcjonalność można docenić już po kilku pierwszych minutach użytkowania. Podstawowa komenda wykorzystywana w większości zastosowań to s (od substitution). s/day/night/ < oldfile > newfile echo "Sunday" s/day/night/ Sunnight Można wyróżnić cztery składniki powyższego użycia komendy s: nazwa komendy (s), separatory (/), regularne wyrażenie dla wzorca (day), ciąg zastępujący (night). Separator / nie zawsze jest najwygodniejszy, dlatego można wykorzystać też inne znaki: s/\/usr\/local\/bin/\/common\/bin/ s_/usr/local/bin_/common/bin_ s:/usr/local/bin:/common/bin: s /usr/local/bin /common/bin (tak, spacja też działa) Sed przetwarza wejście linia po linii. Domyślnie (bez dodatkowych opcji) zamienia pierwsze wystąpienie wzorca na ciąg zastępujący. Jeśli w pliku tekst.in znajduje się: one two three, one two three four three two one one hundred To instrukcja s/one/one/ < tekst.in wydrukuje ONE two three, one two three four three two ONE ONE hundred Użycie znaku & w ciągu zastępującym odpowiada ciągowi dopasowanemu do wzorca: echo "abc 123" s/[0-9]*/& &/ " abc 123" echo "abc 123" s/[0-9][0-9]*/& &/ "abc 123 123" echo "abc 123" s/[0-9]+/& &/ "abc 123 123" Strona 1/9

Proszę zwrócić uwagę, że wyrażenie regularne w powyższych poleceniach jest dopasowywane do najwcześniejszego miejsca w tekście, a spośród dopasowań zaczynających się w tym samym miejscu wybierany jest najdłuższy tekst pasujący do wzorca. Czy sed może się zapętlić zastępując wzorzec dwoma wystąpieniami wzorca, później czteroma, itd.? Nie. Sed wyszukuje wzorców w liniach tekstu na wejściu. Gdy już dokona podstawienia zmodyfikowana linia drukowana jest na wyjściu i nie jest dalej przetwarzana. Zatem echo "a" s/a/aa/ wydrukuje dwie literki a. Użycie \1 we wzorcu lub w ciągu zastępującym odpowiada ciągowi dopasowanemu w bloku wzorca wyznaczonym przez \(...\) (lub (...) przy opcji -r): echo "rower gruszka" sed -r s/([a-z]+) ([a-z]+)/\2 \1/ "gruszka rower" echo "abc 123 123 def" s/\([123]*\) \1/\1/ "abc123 123 def" echo "abc 123 123 def" s/\([123]\+\) \1/\1/ "abc 123 def" Flaga g powoduje zastąpienie wszystkich wystąpień wzorca w linii ciągiem zastępującym: echo "abc 123" sed -r s/[^ ]+/(&)/ "(abc) 123" echo "abc 123" sed -r s/[^ ]+/(&)/g "(abc) (123)" Flaga liczbowa k powoduje zastąpienie k-tego dopasowania wzorca ciągiem zastępującym. echo "abcdef" s/./&:/4 "abcd:ef" Domyślnie sed drukuje każdą linię. Jeśli wykonywane jest zastąpienie, nowa linia jest drukowana zamiast starej. Gdy użyjemy opcji -n domyślne drukowanie będzie wyłączone. Flaga p drukowanie linii zawierających dopasowanie do wzorca. sed -n s/[żź]/z/gp Flaga w zapisanie do podanego pliku linii zawierających dopasowanie do wzorca. sed -n s/^[0-9]*[02468]$/&/w even < file Flaga _I_ ignoruje wielkość liter przy dopasowywaniu. echo "ABC" s/abc/#/i Flagi można łączyć: sed -n s/a/a/2pw /tmp/file < old > new Strona 2/9

Opcja -e, czyli wiele komend w jednym sedzie: s/begin/begin/ < old s/end/end/ > new sed -e s/begin/begin/ -e s/end/end/ < old > new Dłuższe polecenia nad którymi pracujemy warto zapisywać jako skrypty: s/a/a/g s/e/e/g s/i/i/g s/o/o/g s/u/u/g Zawężenie polecenia do pojedynczej linii, czy przedziału linii, czy też linii pasujących do podanego wzorca: 3 s/[0-9][0-9]*// < old > new /^#/ s/[0-9][0-9]*// /^g/s/g/s/g /^g/ s_g_s_g 1,100 s/a/a/ 101,$ s/a/a/ 1,/start/ s/#.*// /start/,/stop/ s/#.*// Omówmy ostatnią komendę. Zawężęnie /start/,/stop/ działa w następujący sposób: (1) sed szuka pierwszej linii zawierającej słowo ciąg liter start; (2) począwszy od tej linii (włącznie) komenda jest wykonywana aż do linii zawierającej ciąg liter stop (z wyłączeniem tej linii). Komenda d kasuje linię odpowiadającą zawężeniu: 11,$ d <file /^#/ d s/^#.*// sed -e s/#.*// -e s/[ ^I]*$// -e /^$/ d Komenda p drukowanie: sed -n 1,10 p sed -n /match/ p Symbol! odwraca podane zawężenie: sed -n /match/!p Strona 3/9

Komenda q przerywa działanie programu: 11 q Grupowanie przy pomocy nawiasów klamrowych pozwala zagnieżdżać zawężenia: # This script removes #-type comments # between begin and end words. sed -n 1,100 { /begin/,/end/ { s/#.*// s/[ ^I]*$// /^$/ d p /begin/,/end/ { /begin/!{ /end/!{ s/old/new/ Komendy a, i oraz c: /WORD/ { i\add this line before a\add this line after c\change the line to this one /WORD/ a\ Add this line\ This line\ And this line Strona 4/9

Komenda = drukuje numer bieżącej linii: sed -n /PATTERN/ = <file sed -n $= <file sed -n /begin/,/end/ = Pattern buffer to bufor w którym sed trzyma tekst, w którym wyszukuje wzorca. Domyślny przepływ danych to powtórzenia następującego cyklu. sed rozpoczyna wczytując pierwszą linię z wejścia do pattern buffer. Wtedy: (i) Aplikacja kolejnych komend do bieżącej zawartości pattern buffer; Uwaga: komendy zazwyczaj zmieniają pattern buffer (np. komenda s); (ii) Po aplikacji ostatniej komendy drukowanie bieżącej zawartości pattern buffer na wyjście (drukowanie można wyłączyć opcją -n); (iii) Opróżnienie pattern buffer i wczytanie kolejnej linii z wejścia do pattern buffer. Komendy n, N, d, D, p i P: Komenda n drukuje pattern buffer na wyjściu (chyba, że opcja -n użyta), opróżnia pattern buffer i wczytuje do pattern buffer nową linię z wejścia. Komenda N nie drukuje pattern buffer, nie opróżnia pattern space. Czyta ona kolejną linię z wejścia i dokleja ją do aktualnego pattern buffer poprzedzając ją znakiem \n. Komenda d opróżnia pattern buffer, czyta nową linię z wejścia, wkłada tę linię do pattern buffer i przerywa wykonywanie obecnej sekwencji komend zaczynając obrabianie nowej linii od pierwszej w kolejności komendy. Taki przeskok nazywamy rozpoczęciem nowego cyklu. Komenda D usuwa z pattern buffer pierwszą linię (to jest ciąg znaków do pierwszego \n), nie wczytuje nowej linii do pattern buffer i rozpoczyna nowy cykl. Komenda p drukuje cały pattern buffer. Komenda P drukuje pierwszą linię pattern buffer. Te komendy nie zmieniają zawartości pattern buffer. Przykład: do każdej linii kończącej się znakiem # dokleja następną linię (ale do tej kolejnej nic nie jest doklejane): # look for a "#" at the end of the line /#$/ { # Found one - now read in the next line N # delete the "#" and the new line character, s/#\n// Przykład: kasuje wszystko pomiędzy ONE i TWO pojawiających się odpowiednio po sobie Strona 5/9

w tej samej lub sąsiadujących liniach. Pytanie na zrozumienie: czy semantyka skryptu zmieni się jeśli zamiast komendy D napiszemy d? /ONE/ { # append the next line N # look for "ONE" followed by "TWO" /ONE.*TWO/ { # delete everything between s/one.*two/one TWO/ # print P # then delete the first line D Przykład: doklejenie do początku każdej linii jej numeru: = file \ { N s/\n/ / Poza pattern space sed ma jeszcze jedno miejsce w którym możemy zapamiętać i edytować linie przeczytane z wejścia, mianowicie hold buffer. Jest pięć komend obsługujących hold buffer: x, h, H, g oraz G. Komenda x zamienia wartości pattern buffer i hold buffer. Jaki jest zatem efekt polecenia x? Komenda h kopiuje pattern buffer do hold buffer. Komenda H dokleja pattern buffer do końca hold buffer poprzedzając go znakiem \n. Komenda g kopiuje hold buffer do pattern buffer. Komenda G dokleja hold buffer do końca pattern buffer poprzedzając go znakiem \n. A teraz czas na bardziej rozbudowany i sensowny przykład. Oto implementacja grepa, który poza linią z dopasowaniem drukuje również jej konekst, czyli linię poprzednią i linię następną. Niestety, jeśli ta implementacja przeocza niektóre wystąpienia... Strona 6/9

# if there is only one argument, exit case $# in 1);; *) echo "Usage: $0 pattern";exit;; esac; # I hope the argument doesn t contain a / sed -n /$1/!{ # put the non-matching line in the hold buffer h /$1/ { # found a line that matches # add the next line to the pattern space N # exchange the previous line with the # 2 in pattern space x # now add the two lines back G # and print it. p # add the three hyphens as a marker a\ --- # remove first 2 lines s/.*\n.*\n\(.*\)$/\1/ # and place in the hold buffer for next time h I na koniec dwie komendy sterujące sed. Komenda b przeskakuje do miejsca wskazanego przez podaną etykietę. Jeśli po komendzie b nie ma żadnej etykiety przeskakujemy do końca cyklu. Komenda t przeskakuje do podanej etykiety jeśli ostatnio wykonane podstawienie zmodyfikowało pattern buffer. Przykład: jeśli paragraf zawiera szukaną frazę to drukujemy cały paragraf. Paragrafy oddzielone są pustymi liniami. Pierwszy skrypt bez użycia komendy b, drugi z użyciem b. Dlaczego drugi skrypt jest lepszy? Strona 7/9

sed -n /^$/!{ H /^$/ { x / $1 / p $ { x / $1 / p sed -n # if an empty line, check the paragraph /^$/ b para # else add it to the hold buffer H # at end of file, check paragraph $ b para # now branch to end of script b # this is where a paragraph is checked for the pattern :para # return the entire paragraph # into the pattern space x # look for the pattern, if there - print / $1 / p Przykład użycie komendy t: z podanego tekstu usuń nawiasy ( i ) występujące w podanej kolejności i przedzielone co najwyżej białymi znakami. s/([ ^I]*)//g A co jeśli chcemy wykonywać to czyszczenie tak długo dopóki nie będzie takich nawiasów (czyli dla ciągu ((())) wynikowy ciąg jest pusty)? :again Strona 8/9

s/([ ^I]*)// t again Strona 9/9