Kubek sed to najpotrzebniejsze polecenia edytora 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:
| adres | zakres 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 |
| -n | wyłącza domyśle drukowanie każdej linii, drukowane są jedynie linie wskazane komendą p lub flagą p komendy s |
| -e cmd | parametr 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 script | parametr 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 |
| \C | znak 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 |
| \n | odwoł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]] l | wyświetl również białe znaki |
| [addr1[,addr2]] p | wyświetl zawartość pattern space |
| [addr1[,addr2]] d | skasuj zawartość pattern space, rozpocznij nowy cykl |
| [addr1[,addr2]] n | wczytaj nową linię do pattern space |
| [addr1[,addr2]] g | usuń zawartość pattern space, wstaw tam zawartość bufora |
| [addr1[,addr2]] h | usuń zawartość bufora, wstaw do niego zawartość pattern space |
| [addr1[,addr2]] x | zamień zawarość bufora i pattern space |
| [addr1[,addr2]] P | wydrukuj pierwszą linię pattern space - do znaku nowej linii |
| [addr1[,addr2]] D | usuń z pattern space pierwszą linię - do znaku nowej linii |
| [addr1[,addr2]] N | wczytaj do pattern space kolejną linię |
| [addr1[,addr2]] G | dodaj zawartość bufora do pattern space |
| [addr1[,addr2]] H | dodaj zawartość pattern space do bufora |
| [addr] q | wyświetl pattern space i zakończ działanie |
| [addr1[,addr2]] w wfile | zapisz zawartość pattern space do pliku wfile |
| [addr] r rfile | wczytaj 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 |
| : label | oznacz 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ść.

