Wstęp do informatyki 2011/2012 Wyrażenia regularne (sed)
Sed sed [OPCJE] polecenia [plik_wejściowy]... sed [OPCJE] -f skrypt_z_poleceniami_seda [plik_wejściowy]... Edytor strumieniowy stosowany do przetwarzania plików tekstowych. Przykłady: http://sed.sourceforge.net/sed1line.txt
Sed podstawianie s/wyrażenie_regularne/tekst/znacznik Zastępuje pasujące fragmenty tekstem. Często stosowana instrukcja seda. Prosty przykład: > sed s/ala/ola/ plik.txt
Sed - podstawianie s/wyrażenie_regularne/tekst/znacznik Wyrażenia regularne RE (patrz: info sed): znak pasuje do siebie * - pasuje do ciągu o długości zero lub więcej wyrażeń regularnych stojących przed tym symbolem, np.: ab* pasuje do napisów postaci: a, ab, abb, abbb...
Sed - podstawianie. - pasuje do każdego znaku (w tym znaku nowej linii) ^ - RE po ^ pasuje tylko na początku linii $ - RE przed $ pasuje tylko na końcu linii Np.: ^abc$ - pasuje tylko do linii, w których jest wyłącznie abc
Sed - podstawianie [LISTA] pasuje do znaku z listy, można używać przedziałów, np. A-Z, 0-9. [^LISTA] j/w, ale pasuje do znaku poza listą Np.: [abd] pasuje do znaku a, b lub d [A-Za-z] pasuje do litery [^0-4] pasuje do znaku różnego od 0,1,2,3,4
Sed - podstawianie RE1RE2 łączenie wzorców: RE1 z RE2 RE1\ RE2 pasuje do RE1 lub RE2 Przykład: a[a-z] pasuje do aa, ab,... Ala\ Ewa pasuje do Ala lub Ewa
Sed - podstawianie \{N\} N wystąpień RE, np.: a\{3\} pasuje tylko do aaa \{N,M\} od N do M wystąpień RE \{N,\} od N wystąpień RE
Sed - podstawianie \n znak nowej linii \CHAR znaki specjalne \* \$ \. \[ \\ \^ Przykład: \[.*] - pasuje do napisów w nawiasach kwadratowych
Sed - podstawianie \(RE\) - grupuje wyrażenie regularne, można później odwołać się do niego w sekcji tekst, przez \1, \2... \9, tj. kolejny numer grupowania Np.: \(abc\)1234\([a-z]\) - wzorzec pasuje do tekstów np, abc1234a, abc1234b,... Pierwsze trzy litery to grupa 1, ostatnia litera to grupa 2.
Sed - podstawianie s/wyrażenie_regularne/tekst/znacznik W sekcji tekst można m.in. używać: & - oznacza dopasowany do wzorca RE napis \1, \2,..., \9 numer grupy z RE (patrz poprzedni slajd) Przykład: sed s/\(abc\)1234\([a-z]\)/\1\2/ Tutaj RE: \(abc\)1234\([a-z]\) a tekst to: \1\2
Sed - podstawianie s/wyrażenie_regularne/tekst/znacznik Znamy już RE. Teraz znaczniki: pusty - zastąp tylko pierwsze wystąpienie wzorca w linii g zastąp wszystkie n zastąp n-te wystąpienie wnazwa zapisz po zastąpieniu do pliku NAZWA
Sed Ważna uwaga dot. dopasowywania. W przypadku zawierających się fragmentów tekstu pasujących do wzorca RE, sed wybierze najdłuższy. s/aa*/dopasowany:&:/g XXaaaXX XXDOPASOWANY:aaa:XX Pasujące tutaj: a, aa, aaa
Sed - podstawianie A teraz kilka przykładów. > sed 's/[yy]aer/year/g' > sed 's/\(.*\).mp3/\1/g' > sed 's/^function/procedure/' > sed 's/^$/pusta/' Czy to usunie dobrze nawiasy kwadratowe? > sed 's/\[\(.*\)]/\1/'
Sed Pamiętajmy, że pomiędzy literami występują puste ciągi pasujące do wzorców z *. Np. XX można czytać jako X X, gdzie oznacza pusty napis. Wtedy podstawienie: s/a*/podst:&:/g dla XX znajdzie 3 puste pasujące ciągi: XX PODST::XPODST::XPODST::
Sed s/a*/podst:&:/g Pamiętajmy też o zasadzie najdłuższego pasującego tekstu: ax PODST:a:XPODST:: aa PODST:aa: XaaXa PODST::XPODST:aa:XPODST:a:
Sed - podstawianie Powielanie: > sed 's/pawel\ Piotr/&&/g' Łączenie sedowych instrukcji: > sed 's/aa/&&/g; s/bb//g' lub > sed -e '...' -e '...'
Sed - kontynuacja Warto zapamiętać opcję -n sed powstrzymuje automatyczne wypisywanie przetwarzanych linii, oraz znacznik p, który powoduje wypisanie dopasowanych linii: > ls sed -n 's/txt/text/gp'
Sed podstawianie kont. s/wyrażenie_regularne/tekst/znacznik Zastępuje pasujące fragmenty tekstem. Często stosowana instrukcja seda. Prosty przykład: > sed s/ala/ola/ plik.txt
Sed kont. Podstawianie dla orłów: [Adres1[,Adres2]]s/RE/tekst/znacznik Adres1/2 może być: - wyrażeniem regularnym w ukośnikach: /RE/ - numerem linii lub $ oznaczającym ostatnią linię Gdy podano dwa adresy podstawianie dotyczy linii pomiędzy liniami pasującymi do wzorców łącznie z tymi liniami. Tego typu adresowanie można stosować we wszystkich poleceniach seda.
Sed kont. [Adres1[,Adres2]]s/RE/tekst/znacznik Pytanie. Co gdy dopasowano Adres1, a nie znaleziono Adres2?
Sed kont. > sed /abc/,/def/s/.*//g # to można lepiej niebawem > sed '2,$s/Procedure/Function/g' > sed '/[A-Z]/s/Ala/Ola/g'
Sed usunięcie [Adres1[,Adres2]] d [Adres1[,Adres2]]!d Usuwa linie wg znaczników.
Sed kont. > sed /abc/,/def/d > sed '2,$d' > sed 10d > sed $d
Sed inne polecenia [Adres1[,Adres2]]i TEKST [Adres1[,Adres2]]a TEKST [Adres1[,Adres2]]c TEKST Dołączanie przed (i) i za bieżącą linią (a) oraz zastępowanie (c) linii. > sed '3,$i ABC' > sed '2c Nowa druga linia'
Sed podprogramy [Adres1[,Adres2]]{... } Grupowanie poleceń. > sed '3,${ s/x/y/g s/a/b/g }'
Sed Lepiej napisać skrypt: > cat skrypt.sed s/pawel\ Piotr/&&/g s/aa//g s/nowak/nowakowski/ #A KU KU - to KomentarZ > sed -f skrypt.sed uczestnicy.txt
Sed A najlepiej skrypt wykonywalny: > cat skrypt.sed #!/usr/bin/sed -f s/pawel\ Piotr/&&/g s/aa//g s/nowak/nowakowski/ > ls -l skrypt.sed -rwx--------... skrypt.sed >./skrypt.sed uczestnicy.txt
Brzydkie przykłady, czyli czego unikać Nie rozumiem przedziałów: > sed 's/[100-999]/to nie 3-cyfrowa liczba/g' Nie znam operatora iteracji: > sed 's/[0-9][0-9][0-9][0-9][0-9]/okropne/g' Niepotrzebne przetwarzanie całej linii. Także, jak pokazać nieznajomość adresowania (i nie tylko): > sed 's/^ziutek:.*:.*:.*:.*:.*:\([0-9]\)$/\1/' Nie znam d i nie rozumiem g: > sed 's/^.*$//g'
Dziękuję za uwagę.