Co to jest sed i do czego służy?

20

sedOstatnio dużo widuję i wydaje mi się, że jest to dość mylące polecenie. Strony nie były szczególnie pomocne, ale wiem, że można ich użyć do analizy wyników innych poleceń.

Czym dokładnie jest sedi do czego służy? Szukam wyczerpującej odpowiedzi obejmującej to sed, czym jest, do czego jest powszechnie używana oraz kilka podstawowych przykładów / składni.

Seth
źródło
3
Ze strony Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.
podręcznika
To powinno być dobre miejsce na rozpoczęcie kompleksowej odpowiedzi: en.wikipedia.org/wiki/Sed
saji89
1
info sedma o wiele więcej niż man sed. Potem /usr/share/doc/sedjest sedfaq.txt.gz.

Odpowiedzi:

20

W podstawowym użyciu służy do „wyszukiwania i zamiany” na ciągi znaków.

echo "The quick brown fox jumps over the lazy dog" | sed 's/dog/cat/'

zwroty

"The quick brown fox jumps over the lazy cat"

Sed naprawdę świeci, gdy używa się z nim wyrażeń regularnych.

Może chcesz przyjrzeć się tym artykułem o sedjego dość wyczerpujące.

poważny
źródło
5

Definicje

Unix System V: praktyczny przewodnik , książka Marka Sobella:

Narzędzie sed jest edytorem wsadowym (nieinteraktywnym). Polecenia sed są zwykle przechowywane w pliku skryptu. . . chociaż możesz wydawać proste polecenia sed z wiersza poleceń. . .

Strona podręcznika dla sed (GNU sed) 4.2.2:

Sed to edytor strumieniowy. Edytor strumienia służy do wykonywania podstawowych transformacji tekstu w strumieniu wejściowym (pliku lub danych wejściowych z potoku).

Moja nieformalna definicja:

Sed(skrót od stream editor ) to narzędzie do przetwarzania tekstu, które zostało opracowane w czasie, gdy tekst był przetwarzany jeden wiersz na raz, ale pozostaje jednym z najpotężniejszych narzędzi Unix / Linux; jednocześnie jest to forma języka skryptowego, zaprojektowana specjalnie do przetwarzania tekstu.

Używa

Jak sugerują definicje, sedsłuży do przetwarzania wsadowego wierszy tekstu, plików tekstowych i strumieniowych strumieni tekstu. Najczęściej służy do zastępowania i usuwania tekstu:

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

Można go jednak również wykorzystać do naśladowania zachowania innych poleceń.

  • naśladować dmesg | head -n 3(drukowanie pierwszych 3 wierszy), możemy to zrobić dmesg | sed -n 1,3p.
  • naśladować dmesg | grep 'wlan0'(szukanie łańcucha), możemy to zrobićdmesg | sed -n '/wlan0/p'
  • Element listy

Dużą przewagą sednad innymi narzędziami do przetwarzania tekstu jest -iflaga, co oznacza, że ​​nie możemy po prostu wyprowadzić edytowanego tekstu na ekran, ale faktycznie zapisać edycję w oryginalnym pliku. awksmaki, przeciwnie, mają taką funkcję tylko w GNU awkwersji.

sedmoże pobierać dane z wiersza poleceń, z wieloma wzorami oddzielonymi średnikiem ( ;) lub z pliku skryptu określonego po -fflagi, np.cat someTextfile.txt | sed -f myScript.sed

Aplikacje Sed i przykłady

Sergiy Kolodyazhnyy
źródło
1

Ta odpowiedź jest w toku - brakuje więcej przykładów na temat polecenia susbstitute


Co to jest sed?

sed = Edytor strumienia

Opis na stronie podręcznika sedraportów GNU 4.2.2:

Sed to edytor strumieniowy. Edytor strumienia służy do wykonywania podstawowych przekształceń tekstu w strumieniu wejściowym (pliku lub danych wejściowych z potoku). Chociaż pod pewnymi względami podobny do edytora, który pozwala na edycję skryptową (np. Ed), sed działa, wykonując tylko jedno przejście przez dane wejściowe, a zatem jest bardziej wydajny. Ale to zdolność seda do filtrowania tekstu w potoku, co szczególnie odróżnia go od innych typów edytorów.

Opis na stronie GNU sedna gnu.org donosi:

sed (edytor strumieniowy) nie jest interaktywnym edytorem tekstu. Zamiast tego służy do filtrowania tekstu, tzn. Pobiera tekst, wykonuje na nim pewne operacje (lub zestaw operacji) i wysyła zmodyfikowany tekst. sed jest zwykle używany do wyodrębnienia części pliku za pomocą dopasowania wzorca lub podstawienia wielu wystąpień ciągu w pliku.

Do czego sedsłuży?

Można go używać do wykonywania złożonych modyfikacji strumieni danych (zwykle tekstu, ale można go również modyfikować dane binarne).

Do najczęstszych przypadków użycia należą:

  • Selektywne drukowanie / usuwanie linii z pliku tekstowego przy użyciu podstawowych / rozszerzonych wyrażeń regularnych
  • Globalne zastępowanie ciągów w pliku tekstowym przy użyciu podstawowych / rozszerzonych wyrażeń regularnych
  • Selektywne zastępowanie ciągów w pliku tekstowym przy użyciu podstawowych / rozszerzonych wyrażeń regularnych

Są to przypadki użycia ujęte w tej odpowiedzi.

Stosowanie

sedodczytuje dane wejściowe z pliku przechowywanego w systemie plików, jeśli nazwa pliku jest podana w argumentach wiersza poleceń podczas jego wywoływania, lub stdinjeśli nie podano nazwy pliku.

Minimalne wywołanie przy użyciu pliku przechowywanego w systemie plików:

sed '' file

Minimalne wywołanie przy użyciu stdin:

# herestring
<<<'Hello, World!' sed ''

# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF

# file
<'file' sed ''

# pipe
echo 'Hello, World!' | sed ''

Witaj świecie!

seddomyślnie czyta plik wejściowy wiersz po wierszu; czyta jedną linię, usuwa końcową nową linię i umieszcza przetworzoną linię w „przestrzeni wzorów”; na koniec wykonuje wymienione polecenia na bieżącej zawartości obszaru wzorców i odczytuje nowy wiersz z pliku wejściowego.

Kiedy komenda nie jest określona lub gdy palbo dkomenda jest określona *, sedzawsze będzie wydrukować bieżącą zawartość przestrzeni wzoru zakończoną nową linią przy każdej iteracji niezależnie:

user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed

Aby temu zapobiec, można wywołać sedwraz z -nprzełącznikiem:

user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ % 

* Mówiąc tylko dla p, di spoleceń, które są polecenia opisane w niniejszej odpowiedzi.

Wybór linii

sedmoże przetwarzać cały plik wejściowy lub przetwarzać tylko wybrane wiersze pliku wejściowego; wybór wierszy pliku wejściowego do przetworzenia odbywa się poprzez określenie „adresów”; adres może być (między innymi) numerem linii lub wzorem; zakresy wierszy można wybrać, określając zakresy adresów.

Możliwe kombinacje adresów to:

  • <N>(gdzie <N>jest liczbą): następujące polecenie / polecenia będą wykonywane tylko na numerze wiersza <N>;
  • <N>,<M>(gdzie <N>i <M>są dwiema liczbami, <N>> <M>): następujące polecenia / polecenia będą wykonywane na liniach od numeru <N>linii do numeru linii <M>włącznie;
  • /<pattern>/(gdzie <pattern>jest podstawowym lub rozszerzonym wyrażeniem regularnym): następujące polecenie / polecenia będą wykonywane tylko w wierszach zawierających wystąpienie <pattern>;
  • /<pattern1>/,/<pattern2>/(gdzie <pattern1>i <pattern2>są podstawowe lub rozszerzone wyrażenia regularne) następujące polecenie / polecenia będą wykonywane na liniach, począwszy od pierwszego wiersza zawierającego wystąpienie <pattern1>do następnego wiersza zawierającego wystąpienie <pattern2>, wiele razy w przypadku wielokrotności zamawiać <pattern1>- <pattern2>occurences;
  • <N>,/pattern/(gdzie <N>jest liczbą i <pattern>jest podstawowym lub rozszerzonym wyrażeniem regularnym): następujące polecenia / polecenia będą wykonywane w wierszach od numeru linii <N>do pierwszego wiersza zawierającego wystąpienie <pattern>;
  • /pattern/,<N>(gdzie <pattern>jest podstawowym lub rozszerzonym wyrażeniem regularnym i <N>jest liczbą): następujące polecenia / polecenia będą wykonywane w wierszach od pierwszego wiersza zawierającego wystąpienie <pattern>do numeru wiersza <N>;

Wybór dokonany w celu wydrukowania, usunięcia lub wykonania podstawień w zakresach linii zawsze będzie obejmować linie pasujące do określonych adresów; ponadto wybór dokonany w celu wydrukowania, usunięcia lub wykonania podstawień na zakresach linii za pomocą wzorów jest leniwy i globalny (tj. każdy objęty zakresem będzie zawsze najmniejszy, jak to możliwe, i wpłynie to na wiele zakresów).

Podczas drukowania zakresów wierszy lub drukowania tylko wierszy, na których przeprowadzono zamianę, konieczne jest wywołanie sedwraz z -nprzełącznikiem, aby nie dopuścić do tego, aby wiersze pasujące do kryterium były drukowane dwukrotnie (dzieje się tak tylko podczas drukowania zakresów wierszy) i w kolejności aby uniemożliwić wydrukowanie wierszy niezgodnych z kryterium, które ma zostać wydrukowane.

Po wyborze wierszy do przetworzenia musi następować polecenie lub wiele poleceń oddzielonych średnikami zgrupowanych za pomocą nawiasów klamrowych.

Polecenia: drukuj, usuwaj

Polecenia użyte do wydrukowania lub usunięcia zaznaczenia to odpowiednio:

  • p: drukuje wiersze pasujące do określonego adresu / zakresu adresów;
  • d: usuwa wiersze pasujące do określonego adresu / zakresu adresów;

Gdy jedno z tych poleceń nie jest poprzedzone adresem / wyborem, polecenie jest wykonywane globalnie, tj. W każdym wierszu pliku wejściowego.

Przykłady: wydrukuj, usuń

Drukowanie / usuwanie wierszy określających adresy numeryczne:

Przykładowy plik:

line1
line2
line3
line4
line5
  • Linia do drukowania <N>:
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • Kasowanie linii <N>:
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
  • Linia <N>do druku <M>włącznie:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
  • Usuwanie linii <N>do <M>włącznie:
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5

Drukowanie / usuwanie linii określających wzory:

Przykładowy plik:

First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
  • Drukowanie linii pasujących <pattern>:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
  • Usuwanie pasujących linii <pattern>:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file 
First line
Random line
Random line
Random line
Last line
  • Drukowanie linii od dopasowania linii <pattern1>do dopasowania linii <pattern2>włącznie:
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
  • Usuwanie linii z dopasowania linii <pattern1>do dopasowania linii <pattern2>włącznie:
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file 
First line
Last line

Polecenie: zastępstwo

Polecenie użyte do wykonania podstawienia zaznaczenia to:

  • s: zastępuje wiersze pasujące do określonego adresu / zakresu adresów;

Gdy to polecenie nie jest poprzedzone adresem / wyborem, polecenie jest wykonywane globalnie, tj. W każdym wierszu pliku wejściowego.

Składnia spolecenia jest następująca:

s/<pattern>/<replacement_string>/<pattern_flags>

Ukośniki to „ograniczniki”; stosuje się je, aby oddzielić <pattern>, <replacement_string>a <pattern_flags>odcinki;

Separator to zawsze znak bezpośrednio po spoleceniu; może być ustawiony na dowolny inny znak, na przykład |:

s|<pattern>|<replacement_string>|<pattern_flags>

<pattern>jest podstawowym lub rozszerzonym wyrażeniem regularnym; <replacement_string>jest stałym ciągiem, który może zawierać sed-specyficzne sekwencje o specjalnym znaczeniu; <pattern_flags>to lista flag, które modyfikują zachowanie <pattern>.

Najczęściej występujące sedsekwencje o specjalnym znaczeniu:

  • &: odniesienie wsteczne zastąpione ciągiem dopasowanym przez <pattern>;
  • \<N>(gdzie <N>jest liczbą): odniesienie wsteczne zastąpione <N>grupą przechwyconą <pattern>;

Najpopularniejsze flagi:

  • g: wymusza <pattern>globalne dopasowanie, tj. wiele razy w każdej linii;
  • i: wymusza <pattern>dopasowanie bez rozróżniania wielkości liter;
  • p: drukuje linie, na których dokonano podstawienia jeszcze raz (przydatne, gdy używasz wywołania -nprzełącznika seddo drukowania tylko linii, na których przeprowadzono podstawienie);

Przykłady: zamiennik

Przykładowy plik:

A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, the bird is the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the word!
A-well-a bird, bird, b-bird's the word
A-well-a...
  • Wymiana pierwszego wystąpienia <pattern>z <replacement_string>każdej linii:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, the bird is the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, bird, b-bird's the word
  • Zastąpienie wszystkich wystąpień <pattern>w <replacement_string>każdej linii:
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, birds, b-birds's the word
A-well-a...
  • Wybierając tylko linie zaczynające się <pattern1>i zastąpienie wszystkich wystąpień <pattern2>z <replacement_string>:
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the word
  • Wybierając tylko linie kończące się <pattern1>i zastąpienie wszystkich wystąpień <pattern2>z <replacement_string>:
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, b-birds's the word
kos
źródło