sed - sed

sed
Paradygmat skrypty
Zaprojektowany przez Lee E. McMahon
Po raz pierwszy pojawiły się 1974 ; 47 lat temu ( 1974 )
Język implementacji C
Strona internetowa www .gnu .org /oprogramowanie /sed /
Wpływem
Ed
Pod wpływem
Perl , AWK

sed ("edytor strumieni") to narzędzie uniksowe , które analizuje i przekształca tekst przy użyciu prostego, zwartego języka programowania. sed został opracowany w latach 1973-1974 przez Lee E. McMahona z Bell Labs i jest obecnie dostępny dla większości systemów operacyjnych. sed opierał się na funkcjach skryptowych interaktywnego edytora ed („edytor”, 1971) i wcześniejszego qed („szybki edytor”, 1965–1966). sed był jednym z najwcześniejszych narzędzi do obsługi wyrażeń regularnych i pozostaje używany do przetwarzania tekstu, w szczególności z poleceniem podstawienia. Popularne alternatywne narzędzia do manipulacji ciągami tekstu jawnego i „edycji strumieniowej” obejmują AWK i Perl .

Historia

Po raz pierwszy pojawił się w wersji 7 Unixa , sed jest jednym z wczesnych poleceń systemu Unix stworzonych do przetwarzania plików danych w wierszu poleceń. Wyewoluował jako naturalny następca popularnego polecenia grep . Pierwotna motywacja była odpowiednikiem grep (g/re/p) dla podstawienia, stąd „g/re/s”. Przewidując, że pojawią się również kolejne programy specjalnego przeznaczenia dla każdego polecenia, takie jak g/re/d, McMahon napisał zorientowany liniowo edytor strumieni ogólnego przeznaczenia, który stał się sed. Składnia sed, w szczególności użycie /for wzorców i s///podstawień, pochodzi od ed , prekursora sed, który był w tamtym czasie powszechnie używany, a składnia wyrażeń regularnych wpłynęła na inne języki, zwłaszcza ECMAScript i Perl . Później rozwinął się potężniejszy język AWK , który funkcjonował jako kuzyni, umożliwiając wydajne przetwarzanie tekstu przez skrypty powłoki . sed i AWK są często cytowane jako przodkowie i inspiracje dla Perla i mają wpływ na składnię i semantykę Perla, zwłaszcza w operatorach dopasowywania i podstawienia.

GNU sed dodał kilka nowych funkcji, w tym edycję plików na miejscu. Super-sed to rozszerzona wersja seda, która zawiera wyrażenia regularne zgodne z Perl . Inny wariant sed jest skrócony , pierwotnie odwrócony z 4.1BSD sed przez Erica S. Raymonda i obecnie utrzymywany przez René Rebe . minised był używany przez Projekt GNU, dopóki Projekt GNU nie napisał nowej wersji seda opartej na nowej bibliotece wyrażeń regularnych GNU. Obecny minised zawiera pewne rozszerzenia sed BSD, ale nie jest tak bogaty w funkcje jak sed GNU. Jego zaletą jest to, że jest bardzo szybki i zużywa mało pamięci. Jest używany w systemach wbudowanych i jest wersją seda dostarczoną z Minixem .

Tryb działania

sed jest narzędziem do przetwarzania tekstu zorientowanego liniowo: odczytuje tekst, linia po linii, ze strumienia wejściowego lub pliku do wewnętrznego bufora zwanego przestrzenią wzorców . Każdy odczytany wiersz rozpoczyna cykl . W przestrzeni wzorców sed stosuje jedną lub więcej operacji, które zostały określone w skrypcie sed . sed implementuje język programowania z około 25 poleceniami, które określają operacje na tekście. Dla każdego wiersza wejściowego, po uruchomieniu skryptu, sed zwykle wypisuje przestrzeń wzorca (wiersz zmodyfikowaną przez skrypt) i rozpoczyna cykl ponownie od następnego wiersza. Inne zachowania końca skryptu są dostępne poprzez opcje seda i polecenia skryptu, np. dusuwanie przestrzeni wzorców, qwyjście, Nnatychmiastowe dodawanie następnej linii do przestrzeni wzorców i tak dalej. Tak więc skrypt seda odpowiada treści pętli, która iteruje przez linie strumienia, gdzie sama pętla i zmienna pętli (bieżący numer linii) są niejawne i obsługiwane przez sed.

Skrypt sed może być podany w wierszu poleceń ( -eopcja) lub odczytany z oddzielnego pliku ( -fopcja). Polecenia w skrypcie sed mogą przyjmować opcjonalny adres, w postaci numerów linii lub wyrażeń regularnych . Adres określa, kiedy polecenie jest uruchamiane. Na przykład 2duruchomiłby polecenie d(usuń) tylko w drugim wierszu wejściowym (drukując wszystkie wiersze oprócz drugiego), podczas gdy /^ /dusunie wszystkie wiersze zaczynające się od spacji. Kilka poleceń seda może używać oddzielnego specjalnego bufora, przestrzeni przechowywania , do przechowywania i gromadzenia tekstu między cyklami. Język poleceń seda ma tylko dwie zmienne ("przestrzeń trzymania" i "przestrzeń wzorca") i funkcjonalność rozgałęziania podobną do GOTO ; niemniej jednak język jest kompletny pod względem Turinga , a ezoteryczne skrypty sed istnieją dla gier takich jak sokoban , arkanoid , szachy i tetris .

A pętli głównej wywoływana po każdej linii strumienia wejściowego, oceny SED skryptu w każdej linii danych wejściowych. Każda z linii skryptu sed jest parą wzorzec-akcja, wskazującą, jaki wzorzec należy dopasować i jaką akcję wykonać, co może zostać przekształcone w instrukcję warunkową . Ponieważ główna pętla, zmienne robocze (przestrzeń wzorców i przestrzeń przechowywania), strumienie wejściowe i wyjściowe oraz akcje domyślne (kopiowanie linii do przestrzeni wzorców, przestrzeń wzorców drukowania) są niejawne, możliwe jest pisanie zwięzłych programów jednowierszowych . Na przykład program sed podany przez:

10q

wydrukuje pierwsze 10 wierszy danych wejściowych, a następnie zatrzyma się.

Stosowanie

Polecenie podstawienia

Poniższy przykład pokazuje typowe i najczęstsze zastosowanie sed: substytucja. To użycie było rzeczywiście pierwotną motywacją dla sed:

sed 's/regexp/replacement/g' inputFileName > outputFileName

W niektórych wersjach sed wyrażenie musi być poprzedzone znakiem, -eaby wskazać, że następuje po nim. sStoi za substytut, natomiast gskrót globalny, co oznacza, że wszystkie zdarzenia pasujące w linii zostanie zastąpiony. Wyrażenie regularne (czyli wzór) mają być przeszukiwane jest umieszczona po pierwszym symbolem ograniczającej (slash tutaj) i wymiana następuje drugi symbol. Ukośnik ( /) to symbol konwencjonalny, wywodzący się ze znaku "szukaj" w ed, ale każdy inny może być użyty do uczynienia składni bardziej czytelną, jeśli nie występuje we wzorcu lub zamienniku; jest to przydatne, aby uniknąć „ syndromu pochylonej wykałaczki ”.

Polecenie substytucji, które wywodzi się z wyszukiwania i zastępowania w ed, implementuje proste parsowanie i tworzenie szablonów . regexpZapewnia zarówno dopasowanie wzoru i zapisywania tekstu poprzez sub-wyrażeń, natomiast replacementmoże być dosłowny tekst, lub ciąg znaków zawierający Format &dla „cały mecz” lub specjalne sekwencje \1 dzięki \9dla n th zapisanych sub-wyrażenie. Na przykład sed -r "s/(cat|dog)s?/\1s/g"zamienia wszystkie wystąpienia „kot” lub „pies” na „koty” lub „psy”, bez duplikowania istniejących „s”: (cat|dog)jest pierwszym (i jedynym) zapisanym podwyrażeniem w wyrażeniu regularnym i \1w formacie string zastępuje to na wyjściu.

Inne polecenia seda

Oprócz podstawienia możliwe są inne formy prostego przetwarzania, przy użyciu około 25 poleceń seda. Na przykład w poniższym przykładzie użyto polecenia d do odfiltrowania wierszy zawierających tylko spacje lub zawierających tylko znak końca wiersza:

sed '/^ *$/d' inputFileName

W tym przykładzie użyto niektórych z następujących metaznaków wyrażeń regularnych (sed obsługuje pełny zakres wyrażeń regularnych):

  • Daszka ( ^) dopasowuje początek linii.
  • Znak dolara ( $) dopasowuje koniec linii.
  • Gwiazdka ( *) oznacza zero lub więcej wystąpień poprzedniego znaku.
  • Plus ( +) pasuje jedno lub więcej wystąpienie (ów) z poprzedniego znaku.
  • Znak zapytania ( ?) dopasowuje zero lub jedno wystąpienie poprzedniego znaku.
  • Kropka ( .) Zastępuje dokładnie jeden znak.

Możliwe są złożone konstrukcje seda, co pozwala mu służyć jako prosty, ale wysoce wyspecjalizowany język programowania . Na przykład przepływem sterowania można zarządzać za pomocą etykiety (dwukropek, po której następuje łańcuch) i instrukcji rozgałęzienia b. Instrukcja, bpo której następuje prawidłowa nazwa etykiety, przeniesie przetwarzanie do bloku następującego po tej etykiecie.

sed używany jako filtr

W systemie Unix sed jest często używany jako filtr w potoku :

generateData | sed 's/x/y/g'

To znaczy, program, taki jak „generateData” generuje dane, a następnie sed sprawia, że małe zmiany zastąpienia X z Y . Na przykład:

$ echo xyz xyz | sed 's/x/y/g'
yyz yyz

Skrypty sed oparte na plikach

Często przydatne jest umieszczenie kilku poleceń seda, po jednym w wierszu, w pliku skryptu, takiego jak subst.sed, a następnie skorzystanie z -fopcji uruchamiania poleceń (takich jak s/x/y/g) z pliku:

sed -f subst.sed inputFileName > outputFileName

W pliku skryptu można umieścić dowolną liczbę poleceń, a użycie pliku skryptu pozwala również uniknąć problemów z wychodzeniem z powłoki lub podstawieniem.

Taki plik skryptowy może być bezpośrednio wykonywalny z wiersza poleceń przez poprzedzenie go " linią shebang " zawierającą polecenie sed i przypisanie uprawnienia do wykonywania do pliku. Na przykład plik subst.sedmoże zostać utworzony z zawartością:

#!/bin/sed -f
s/x/y/g

Plik może następnie być wykonywany przez bieżącego użytkownika za pomocą chmodpolecenia:

chmod u+x subst.sed

Plik można następnie uruchomić bezpośrednio z wiersza poleceń:

subst.sed inputFileName > outputFileName

Edycja na miejscu

-iOpcja, wprowadzony w GNU sed, umożliwia edycję w miejscu plików (faktycznie, tymczasowy plik wynikowy jest tworzony w tle, a następnie oryginalny plik zostanie zastąpiony przez plik tymczasowy). Na przykład:

sed -i 's/abc/def/' fileName

Przykłady

Witaj świecie! przykład

# convert input text stream to "Hello, world!"
s/.*/Hello, world!/
q

To "Witaj świecie!" skrypt znajduje się w pliku (np. script.txt) i jest wywoływany z sed -f script.txt inputFileName, gdzie "nazwaPlikuWejściowego" jest wejściowym plikiem tekstowym. Skrypt zmienia wiersz #1 „inputFileName” na „Hello, world!” a następnie kończy pracę, drukując wynik przed zakończeniem działania seda. Wszelkie wiersze wejściowe za wierszem nr 1 nie są czytane ani drukowane. Tak więc jedynym wyjściem jest "Hello, world!".

Przykład podkreśla wiele kluczowych cech sed:

  • Typowe programy sed są raczej krótkie i proste.
  • Skrypty seda mogą mieć komentarze (linia zaczynająca się od #symbolu).
  • sPoleceń (Zastępca) jest najważniejszym polecenia SED.
  • sed umożliwia proste programowanie za pomocą poleceń takich jak q(quit).
  • sed używa wyrażeń regularnych, takich jak .*(zero lub więcej dowolnego znaku).

Inne proste przykłady

Poniżej śledź różne skrypty sed; można je wykonać, przekazując jako argument do seda, lub umieścić w oddzielnym pliku i wykonać przez -flub czyniąc sam skrypt wykonywalnym.

Aby zamienić dowolne wystąpienie określonego słowa w pliku na „ZMIENIONO”, takie jak hasło IRC, i zapisać wynik:

sed -i s/yourpassword/REDACTED/ ./status.chat.log

Aby usunąć dowolny wiersz zawierający słowo „twojesłowo” ( adres to „/twojesłowo/”):

/yourword/ d

Aby usunąć wszystkie wystąpienia słowa „twoje słowo”:

s/yourword//g

Aby usunąć dwa słowa z pliku jednocześnie:

s/firstword//g
s/secondword//g

Aby wyrazić poprzedni przykład w jednym wierszu, na przykład podczas wpisywania w wierszu poleceń, można połączyć dwa polecenia za pomocą średnika:

sed "s/firstword//g; s/secondword//g" inputFileName

Przykład przetwarzania wieloliniowego

W następnym przykładzie sed, który zwykle działa tylko w jednym wierszu, usuwa znaki nowego wiersza ze zdań, w których drugi wiersz zaczyna się jedną spacją. Rozważ następujący tekst:

This is my dog,
 whose name is Frank.
This is my fish,
whose name is George.
This is my goat,
 whose name is Adam.

Poniższy skrypt sed zamieni powyższy tekst w następujący tekst. Zauważ, że skrypt ma wpływ tylko na wiersze wejściowe, które zaczynają się od spacji:

This is my dog, whose name is Frank.
This is my fish,
whose name is George.
This is my goat, whose name is Adam.

Skrypt to:

N
s/\n / /
P
D

Wyjaśnia się to jako:

  • ( N) dodaj następną linię do przestrzeni wzoru;
  • ( s/\n / /) znajdź nowy wiersz, po którym następuje spacja, zastąp jedną spacją;
  • ( P) drukuj górny wiersz pola wzoru;
  • ( D) usuń górny wiersz z przestrzeni wzorców i ponownie uruchom skrypt.

Można to wyrazić w jednym wierszu za pomocą średników:

sed 'N; s/\n / /; P; D' inputFileName

Ograniczenia i alternatywy

Choć prosty i ograniczony, sed jest wystarczająco potężny do wielu celów. Do bardziej wyrafinowanego przetwarzania używane są bardziej zaawansowane języki, takie jak AWK lub Perl . Są one szczególnie używane przy przekształcaniu linii w sposób bardziej skomplikowany niż wyodrębnianie wyrażeń regularnych i zastępowanie szablonów, chociaż arbitralnie skomplikowane transformacje są w zasadzie możliwe przy użyciu bufora wstrzymania.

I odwrotnie, dla prostszych operacji, wyspecjalizowane narzędzia Unix, takie jak grep (drukuj linie pasujące do wzorca), head (drukuj pierwszą część pliku), tail (drukuj ostatnią część pliku) i tr (tłumacz lub usuwaj znaki) są często preferowane. Dla konkretnych zadań, które mają wykonać, takie wyspecjalizowane narzędzia są zwykle prostsze, jaśniejsze i szybsze niż bardziej ogólne rozwiązanie, takie jak sed.

Polecenia i składnia ed/sed są nadal używane w programach podrzędnych, takich jak edytory tekstu vi i vim . Analogiem do ed/sed jest sam /ssam, gdzie sam jest edytorem Plan 9 , a sam jest interfejsem strumieniowym do niego, zapewniającym funkcjonalność podobną do sed.

Zobacz też

Uwagi

Bibliografia

Dalsza lektura

Zewnętrzne linki

Poradniki

Przykłady

Inne linki