W dzisiejszym odcinku -bardziej i mniej przydatne zastosowania na przykładach!
Operacje na pojedynczej linii tekstu
- zamienić pierwsze wystąpienie słowa dwa na DWA
# używamy operacji s - substitute >echo 'raz dwa, raz dwa, raz dwa' | sed 's|dwa|DWA|' >raz DWA, raz dwa, raz dwa
- zamienić wszystkie wystąpienia słowa dwa na DWA
# używamy flagi g - globally >echo 'raz dwa, raz dwa, raz dwa' | sed 's|dwa|DWA|g' >raz DWA, raz DWA, raz DWA
- zamienić tylko drugie wystąpienie słowa dwa na DWA
# podajemy konkretnie, że interesuje nas wystąpienie nr 2 >echo 'raz dwa, raz dwa, raz dwa' | sed 's|dwa|DWA|2' >raz dwa, raz DWA, raz dwa
- zamienić drugie i wszystkie następne wystąpienia słowa dwa na DWA
# podajemy zakresem, że interesują nas wystąpienia od 2 do końca >echo 'raz dwa, raz dwa, raz dwa' | sed 's|dwa|DWA|2g' >raz dwa, raz DWA, raz DWA
- otoczyć każda liczbę nawiasem (&)
# ampersand & przechowuje dopasowany ciąg # flaga -r oznacza extended regular expressions oraz # pozwala na użycie kwantyfikatora jeden lub więcej(+) >echo '8 plus 12 razy 100' | sed -r 's|[0-9]+|(&)|g' >(8) plus (12) razy (100)
- wyciąć fragment tekstu
# \1 przechowuje fragment tekstu dopasowany wewnątrz nawiasów (.*) >echo 'http://www.tablica.pl' | sed -r 's|http://(.*)|\1|' >www.tablica.pl
- pozamieniać pary słów miejscami
# \1 przechowuje pierwsze, a \2 przechowuje drugie dopasowane słowo >echo 'jeden dwa jeden dwa' | sed -r 's|([a-z]+) ([a-z]+)|\2 \1|g' >dwa jeden dwa jeden
- dopasować wzór w trybie ignore case; taki grep -i
# -n czyli nie printuj, # p czyli printuj jeśli udało się dopasować fragment, # I - ignore case >echo 'WzorDoOdszukania' | sed -n 's|wzordoodszukania|&|Ip' >WzorDoOdszukania
- podmienić kilka wzorców
# flaga -e pozwala łączyć kilka wyrażeń sedowych w jedno wywołanie sed >echo '1+2*(3+2)' | sed -e 's|1|one|' -e 's|2|two|' -e 's|3|three|' >one+two*(three+two)
Operacje na wielu liniach
- zakomentować drugą linię tekstu wejściowego
# konkretnie określamy, że interesuje nas linia nr 2 >echo 'PIERWSZA\nDRUGA\nTRZECIA' | sed '2 s|.*|//&|' >PIERWSZA >//DRUGA >TRZECIA
- zakomentować linie od 5 do 10 w pliku
# podajemy zakres linii 5-10 >sed '5,10 s|.*|//&|' plik
- zakomentować linie od 5 do końca pliku
# podajemy zakres linii 5-koniec pliku >sed '5,$ s|.*|//&|' plik
- zakomentować w pliku linie miedzy nawiasami { oraz } – ciała funkcji
# zacznij od linii zawierającej znak { i skończ na linii zawierającej } >sed '/{/, /}/ s|.*|//&|' plik.cpp
- wypisać treść pliku od funkcji main do końca pliku
# interesują nas linie od wystąpienia słowa main do końca pliku ($) >sed -n '/main/, $ s|.*|&|p' plik.cpp
- usunąć wszystkie puste (^$) linie
# ^$ oznacza pustą linię, d to delete >sed '/^$/ d' main.cpp
- zastąpić wszystkie puste linie komentarzem
# c jak change. # dostępne są też i jak insert (przed dopasowaną linią) # oraz a jak append (po linii) >sed '/^$/ c //---' main.cpp
- Ponumerować linie w pliku (=)
# = przechowuje nr aktualnie przetwarzanej linii >sed '=' main.cpp
- wydrukować nr linii, w której znajduje się funkcja main
# gdy trafisz na linię zawierającą int main, dopisz nr tej linii (=) >sed -n '/int main/ =' main.cpp
- zamienić małe litery na duże litery – jak polecenie tr
# y włącza tryb tłumaczenia znaków >sed 'y|abcdefghijklmnoprstuwxyz|ABCDEFGHIHKLMNOPRSTUWXYZ|' main.cpp
A tutaj bardzo dobry tutorial do SEDa – http://www.grymoire.com/Unix/Sed.html