sed – używanie – przykłady

9 czerwca 2015

SED – edytor strumieniowy służący do filtrowania i przetwarzania tekstu.

Użycie :

sed [opcja] ['wyszukiwany wzorzec'] plik_wejsciowy
sed [opcja] -f skrypt_z_poleceniami plik_wejsciowy

Dostępne opcje :

-n - powstrzymuje automatyczne drukowanie przetwarzanych linii
-e - pobierz polecenie edycji z wiersza poleceń
-f plik-skryptowy - dodaje zawartość pliku skryptowego poleceń, które mają być wykonane.
-l N - ustala pożądaną długość łamanych linii dla opcji `l'.
-r - używa w skrypcie rozszerzonych wyrażeń regularnych.
-s - traktuje pliki jako oddzielne, a nie jako pojedynczy, długi i ciągły strumień.
-u - ładuje minimalną ilość danych z plików wejściowych i częściej oczyszcza bufor wyjściowy.
--help  - wyświetla tę oto pomoc i kończy pracę.
--version - wyświetla numer wersji i kończy pracę.

Polecenia edycji :

c - zastąp wybrane wiersze nowym tekstem.
a - dołącz tekst w pliku wyjściowym.
d - kasuje wskazany wiersz
p - drukuj określone wiersze z pliku (wypisanie dopasowanych linii)
r nazwa_pliku - zawartość podanego pliku jest wstawiana za podanym wierszem

****************
WZORCE :
****************

Używane znaki :

^ wyrażenie regularne po znaku ^ pasuje tylko na początku linii
$ wyrażenie regularne przed znakiem $ pasuje tylko na końcu linii
. pasuje do każdego znaku
* pasuje do ciągu o długości zero lub więcej wyrażeń regularnych, które są przed tym symbolem
[] pasuje do wszystkich znaków pomiędzy tymi znajdującymi się na liście []

Wyrażenia regularne :

'CHAR' dopasowuje pojedynczy zwykły znak
/./  dopasowuje każdy wiersz zawierający co najmniej jeden znak
/../ dopasowuje każdy wiersz zawierający co najmniej dwa znaki
/^#/ dopasowuje każdy wiersz zaczynający się od znaku #
/^$/ dopasowuje każdy pusty wiersz
/}$/ dopasowuje wszystkie wiersze, które kończą się znakiem "}" (brak spacji)
/} *$/ dopasowuje wszystkie wiersze, które kończą się znakiem "}", zaw
/[abc]/ dopasowanie wszystkich wierszy zawierających "a", "b" lub "c".
/^[abc]/ dopasowanie wszystkich wierszy, które zaczynają się od znaku "a", "b" lub "c".

Można również używać klasy znakowe podczas wyszukiwania wzorca :

[:alnum:]    Znaki alfanumeryczne  [a-z A-Z 0-9]
[:alpha:]    Znaki alfabetyczne [a-z A-Z]
[:blank:]    Spacje lub tabulatory
[:cntrl:]    Dowolny znak kontrolny
[:digit:]    Cyfry w zakresie [0-9]
[:graph:]    Znaki  (bez odstępów)
[:lower:]    Małe litery [a-z]
[:print:]    Znaki  z odstępami
[:punct:]    Znaki z wyjątkiem odstępów, liter i cyfr
[:space:]    Wszystkie znaki odstępu
[:upper:]    Duże litery [A-Z]
[:xdigit:]    Cyfry w systemie szesnastkowym [0-9 a-f A-F]

Przykłady użycia sed :

****************
USUWANIE LINII
****************

Składnia w przypadku usuwania wierszy :

sed -e '/wyrażenie_regularne/d' plik_wejsciowy

Usunięcie pierwszej linii z pliku – wyświetlenie zawartości pliku bez pierwszej linii :

sed -e '1d' plik_wejsciowy

Usunięcie linii od 1 do 10.
W przykładzie polecenie d zostało zastosowane dla wierszy od 1 do 10 włącznie. Inne wiersze zostały pominięte:

sed -e '1,10d' plik_wejsciowy

Usuwanie linii zaczynających się np. od znaku komentarza – “#” :

sed -e '/^#/d' plik_wejsciowy

Usuwanie linii, które kończą się znakiem “&”

sed -e '/$&/d' plik_wejsciowy

Usuwanie pustych wierszy :

 sed -e '/^$/d' plik_wejsciowy

********************
ŁĄCZENIE DWÓCH LUB WIĘCEJ POLECEŃ SED (WYKORZYSTANIE OPCJI -e)
********************
np.

Usunięcie wszystkich linii zaczynających się od znaku “;” oraz “#” a także tych wierszy, które są puste :

 sed -e '/^;/d' -e '/^#/d' -e '/^$/d' plik_wejsciowy 

********************
WYPISANIE DOPASOWANYCH LINII-WIERSZY do wzorca – znacznik p
********************

np. Wypisanie komentarzy z pliku “plik_wejsciowy” :

sed -n -e '/^#/p' plik_wejsciowy

Wypisanie linii od 2 do 6 z pliku “plik_wejsciowy”:

sed -n '2,6p' plik_wejsciowy

Wypisanie wszystkich linii z pliku “plik_wejsciowy” oprócz wiersza od 9 do 12 :

sed -n '9,12!p' plik_wejsciowy

*********************
PODSTAWIANIE – ZASTĘPOWANIE
*********************
**********
Składnia :
**********

s/wyrazenie_regularne/tekst/znacznik

Zastępowanie określonych ciągów znaków innym ciągiem znaków:

sed 's/wyraz1/wyraz2/' plik_wejsciowy

czyli w każdym wierszu pierwsze wystąpienie ciągu znaków ‘wyraz1’ zostanie zastąpione przez ‘wyraz2’.

np. zastąpienie protokołu tcp na udp

sed -e 's/tcp/udp/' services_kopia

Zastępowanie globalne (g). Zastępowanie wszystkich wystąpień w wierszu :

sed -e 's/wyraz1/wyraz2/g' plik_wejsciowy

Zastępowanie ciągu znaków w pliku od wiersza 1 do 11 :

sed -e '1,11s/#/#to jest komentarz/' plik_wejsciowy

Jeżeli chcemy zamienić wszystkie ścieżki np. /usr na /usr/local to zamiast użycia separatora “/” należy użyć inny separator np. “:”.

sed -e 's:/usr:/usr/local:g' plik_wejsciowy

Dołączenie na początku każdego wiersza (również pustego) znaku “#” :

sed -e 's/.*/# &/' plik_wejsciowy

Zastępowanie pustych wierszy słowem “czysty” :

sed -e 's/^$/czysty/' plik wejsciowy

Zamiana “Rip” lub “rip” na “static” :

sed -e 's/[Rr]ip/static/g' plik wejsciowy

Zastępowanie plików tekstowych o rozszerzeniu .txt rozszerzeniem .doc :

ls | sed -n 's/txt/doc/p'

Na dodatek 🙂

Numerowanie wierszy w pliku z użyciem sed:

sed = plik_wejsciowy | sed 'N;s/\n/\t/' | more

Warto wiedzieć :

Numerowanie wierszy w pliku z użyciem nl,cat,awk:

nl plik_wejsciowy | more
cat -n plik_wejsciowy
awk '{ print FNR "\t" $0 }' plik_wejsciowy | more

cdn 🙂

markos
Specjalizuję się w systemach komputerowych Windows oraz Linux. Oprócz wykonywanej pracy w zawodzie, informatyka jest moją pasją.

Dodaj komentarz

avatar
  Subscribe  
Powiadom o