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

Related Posts: