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 sed
raportó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 sed
na 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 sed
sł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
sed
odczytuje 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 stdin
jeś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!
sed
domyś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 p
albo d
komenda jest określona *, sed
zawsze 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ć sed
wraz z -n
przełą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
, d
i s
poleceń, które są polecenia opisane w niniejszej odpowiedzi.
Wybór linii
sed
moż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 sed
wraz z -n
przełą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
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
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 s
polecenia 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 s
poleceniu; 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 sed
sekwencje 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 -n
przełącznika sed
do 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
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.