Kubek sed to najpotrzebniejsze polecenia edytora sed.

Kubek sed

Dzięki niemu, spis najważniejszych komend edytora sed jest zawsze pod ręką, a właściwie na biurku. Ty też możesz go mieć.

Sed - budowa, działanie, polecenia

Sed jest edytorem strumieniowym, tzn. czyta linie wejściowe ze wskazanego pliku lub ze standardowego wejścia (stdin), przetwarza je - każdą linię, linia po linii - zgodnie z podanymi opcjami i wskazanym skryptem, wynik zaś wypisuje na standardowym wyjściu (stdout). Przetwarzanie polega na tym, że każda wczytana linia ładowana jest do tak zwanego pattern space. Gdy linia najdzie się w pattern space podlega "obróbce" zgodnie z zadanymi w skrypcie poleceniami. Gdy na pattern space zostaną wykonane wszystkie polecenia skryptu, zawartość pattern space jest wyświetlana na stdout, a do pattern space wczytywana jest kolejna linia i proces jest powtarzany, aż do końca pliku wejściowego. Opisany powyżej sposób działania, jest podstawowym algorytmem pracy sed. Niektóre polecenia operują na kilku liniach (polecenia P, D, N, G, H), inne zaś modyfikują opisany wyżej proces poprzez skoki (polecenia b, t, oraz :), lub wcześniej kończą przetwarzanie skryptu (polecenia d, D, q). Sed dysponuje również jednym buforem wewnętrznym, do którego może być kopiowana zawartość pattern space i którego zawartość może być kopiowana do pattern space.

Składnia wywołania

Edytor sed można uruchomić na dwa sposoby:

  • sed [-n] [-e] '[adres [, adres]] [!] cmd'
  • sed [-n] -f script

Znaczenie parametrów:

adreszakres linii do których ma być zastosowane polecenie; adres może być podany jako liczba dziesiętna, wyrażenie regexp, może być też pusty, w takim przypadku polecenie zostanie zastosowane do całego pliku; $ oznacza ostatnią linię
!odwraca zakres linii, do których zastosowane będzie polecenie tj. polecenie będzie zastosowane do linii z poza podanego zakresu
-nwyłącza domyśle drukowanie każdej linii, drukowane są jedynie linie wskazane komendą p lub flagą p komendy s
-e cmdparametr wskazuje, że cmd jest skryptem sed napisanym bezpośrednio w linii poleceń np.: sed -e '1,5p' -e 'l'; zwykle cmd jest ograniczane znakami ' aby shell nie interpretował polecenia sed, nie jest to jednak konieczne
-f scriptparametr wskazuje, że script jest plikiem zawierającym polecenie sed


Zakres działanie skryptu

Zakres działanie skryptu sed jest określony przez podane adresy. Adres może być podany jako liczba dziesiętna albo wyrażenie regexp. Adres może też nie zostać podany, w takim przypadku skrypt zostanie zastosowany do całego pliku; $ oznacza ostatnią linię pliku wejściowego. ! odwraca zakres linii, do których zastosowane będzie polecenie tj. polecenie będzie zastosowane do linii z poza podanego zakresu. Nawiasy { } mogą być użyte do zagnieżdżenie jednej komendy w drugiej lub do zastosowania kilku komend do podanego zakresu:

[adres1[, adres2]]{
cmd1
cmd2
}

Wyrażenia regularne REGEXP

Edytor sed obsługuje podstawowe wyrażenia regularne.

.pojedynczy znak, ale nie znak nowej linii
C*dowolna ilość znaków C, również 0 znaków C
[...]każdy znak zawarty pomiędzy [ oraz ]
[^...]każdy znak NIE zawarty pomiędzy [ oraz ], ale bez znaku nowej linii
[x-y]każdy znak z zakresu pomiędzy x i y np. [0-9] lub [a-z]
C\{n,m\}nie mniej niż n i nie więcej niż m wystąpień znaku C
^początek linii
$koniec linii
\Cznak C jest traktowany dosłownie, np. \* oznacza dosłownie *
\(pattern\)łańcuch lub dopasowanie zawarte pomiędzy \( oraz \) jest zapamiętywany i można się do niego później odwołać poprzez \n
\nodwołanie do poprzednio zapamiętanego łańcucha lub dopasowania, np. \1 odwołuje się do pierwszego zapamiętanego dopasowania, \2 do drugiego itd.
&odwołanie do całości dopasowanego tekstu

Komendy sed

Komendy sed są jednoliterowe. Większość z nich operuje na jednej linii pliku wejściowego, niektóre operują na wielu liniach. Dla większości komend można podać zakres linii dla którego komenda ma być wykonana. Dla nielicznych komend można podać jedynie pojedynczy adres. Adres może być w postaci liczby dziesiętnej, wyrażenia regularnego (regexp). Można go też nie podać wcale - w takim przypadku komenda będzie zastosowana do wszystkich linii wejścia.

[addr] i\
     text
poprzedź wskazaną linię napisem text, znaki nowej linii w text powinny być poprzedzone poprzez \
[addr] a\
     text
wyświetl po wskazanej linii napis text, znaki nowej linii w text powinny być poprzedzone poprzez \
[addr1[,addr2]] c\
     text
zamień wskazane linie na text, znaki nowej linii w text powinny być poprzedzone poprzez \; w przypadku podania dwu adresów, wszystkie linie pomiędzy adresami zostaną zastąpione poprzez jedno wystąpienie text
[addr1[,addr2]] s/ptr/str/[fl]zamień łańcuch ptr na łańcuch str, ptr może również wyrażeniem regularnym, str może zawierać odwołania do ptr - patrz sekcja REGEXP; flagi [fl]: n - n-te wystąpienie, g - każde wystąpienie, p - wyświetl wynik zamiany, w wfile zapisz wynik zamiany do pliku wfile
[addr1[,addr2]] y/src/dst/zastąp znaki łańcucha src znakami łańcucha dst zamiana jest jeden do jeden (np.: s na d, r na s, c na t)
[addr] =wyświetl numer linii
[addr1[,addr2]] lwyświetl również białe znaki
[addr1[,addr2]] pwyświetl zawartość pattern space
[addr1[,addr2]] dskasuj zawartość pattern space, rozpocznij nowy cykl
[addr1[,addr2]] nwczytaj nową linię do pattern space
[addr1[,addr2]] gusuń zawartość pattern space, wstaw tam zawartość bufora
[addr1[,addr2]] husuń zawartość bufora, wstaw do niego zawartość pattern space
[addr1[,addr2]] xzamień zawarość bufora i pattern space
[addr1[,addr2]] Pwydrukuj pierwszą linię pattern space - do znaku nowej linii
[addr1[,addr2]] Dusuń z pattern space pierwszą linię - do znaku nowej linii
[addr1[,addr2]] Nwczytaj do pattern space kolejną linię
[addr1[,addr2]] Gdodaj zawartość bufora do pattern space
[addr1[,addr2]] Hdodaj zawartość pattern space do bufora
[addr] qwyświetl pattern space i zakończ działanie
[addr1[,addr2]] w wfilezapisz zawartość pattern space do pliku wfile
[addr] r rfilewczytaj i wstaw zawartość pliku rfile do pattern space
[addr1[,addr2]] b [label]skocz do etykiety [label], a jeśli jej nie ma to skocz na koniec pliku
[[addr1[,addr2]] t [label]warunkowy skok do etykiety label, skok jest wykonywany jeśli nastąpiła podmiana od ostatniego odczytu linii wejściowej, lub wywołania komendy t; jeśli nie ma etykiety następuje skok na koniec skryptu
labeloznacz linię skryptu etykietą label


Tomasz Zin

Na podstawie O'Reilly "Sed & awk" Dale Dougherty & Arnold Robbins; Second Edition, March 1997, ISBN 1-56592-225-5. Wyrażona powyżej opinia jest prywatnym poglądem autora wypowiedzi. Korzystasz na własną odpowiedzialność.