Sed lub Edytor Strumieni jest bardzo potężnym narzędziem oferowanym przez systemy Linux/Unix. Jest on głównie używany do podstawiania tekstu, znajdowania & replace ale może również wykonywać inne operacje na tekście jak wstawianie, usuwanie, wyszukiwanie itp. Dzięki Sedowi możemy edytować całe pliki bez konieczności ich otwierania. Sed wspiera również użycie wyrażeń regularnych, co czyni sed jeszcze potężniejszym narzędziem do manipulacji testami.
W tym artykule nauczymy się używać komendy SED z pomocą kilku przykładów. Podstawowa składnia polecenia sed to,
sed OPCJE…
Zobaczmy teraz kilka przykładów.
Przykład :1) Wyświetlanie częściowego tekstu pliku
Z pomocą sed, możemy zobaczyć tylko część pliku, zamiast widzieć cały plik. Aby zobaczyć niektóre linie pliku, użyj następującego polecenia,
$ sed -n 22,29p testfile.txt
Tutaj, opcja 'n' wyłącza drukowanie całego pliku & opcja 'p' wydrukuje tylko linie od 22 do 29.
Przykład :2) Wyświetl wszystkie z wyjątkiem niektórych linii
Aby wyświetlić całą zawartość pliku z wyjątkiem pewnej części, użyj następującego polecenia,
$ sed 22,29d testfile.txt
Opcja 'd' usunie wspomniane linie z wyjścia.
Przykład :3) Wyświetlanie każdej 3. linii zaczynającej się od N-tej linii
Aby wyświetlić zawartość każdej 3. linii zaczynającej się od linii numer 2 lub dowolnej innej linii, użyj następującego polecenia
$ sed -n '2~3p' file.txt
Przykład :4 ) Usuwanie linii za pomocą polecenia sed
Aby usunąć linię za pomocą sed z pliku, użyj następującego polecenia,
$ sed Nd testfile.txt
gdzie 'N' to numer linii & opcja 'd' usunie wspomniany numer linii. Aby usunąć ostatnią linię pliku, użyj
$ sed $d testfile.txt
Przykład :5) Usuwanie zakresu linii
Aby usunąć zakres linii z pliku, uruchom
$ sed '29,34d' testfile.txt
To usunie linie od 29 do 34 z pliku testfile.txt.
Przykład :6) Usuwanie linii innych niż wymienione
Aby usunąć linie inne niż wymienione z pliku, użyjemy '!'
$ sed '29,34!d' testfile.txt
Tutaj opcja '!' jest użyta jako nie, więc odwróci warunek, tj. nie usunie wymienionych linii. Wszystkie linie inne niż 29-34 zostaną usunięte z pliku testfile.txt.
Przykład :7) Dodawanie pustych linii/spacji
Aby dodać pustą linię po każdej niepustej linii, użyjemy opcji 'G',
$ sed G testfile.txt
Przykład :8) Wyszukiwanie i zastępowanie ciągu znaków za pomocą sed
Aby wyszukać & zastąpić ciąg znaków z pliku, skorzystamy z poniższego przykładu,
$ sed 's/danger/safety/' testfile.txt
tutaj opcja 's' wyszuka słowo 'danger' & zamień je na 'safety' w każdej linii tylko dla pierwszego wystąpienia.
Przykład :9) Wyszukaj i zastąp ciąg znaków z całego pliku używając sed
Aby całkowicie zastąpić słowo z pliku, użyjemy opcji 'g' z 's',
$ sed 's/danger/safety/g' testfile.txt
Przykład :10) Zastąp n-te wystąpienie wzorca ciągu znaków
Możemy również zastąpić ciąg znaków przy n-tym wystąpieniu z pliku. Na przykład zastąpić 'niebezpieczeństwo' na 'bezpieczeństwo' tylko przy drugim wystąpieniu,
$ sed ‘s/danger/safety/2’ testfile.txt
Aby zastąpić 'niebezpieczeństwo' przy drugim wystąpieniu każdej linii z całego pliku, użyj
$ sed 's/danger/safety/2g' testfile.txt
Przykład :11) Zastąp ciąg w konkretnej linii
Aby zastąpić ciąg tylko z konkretnej linii, użyj
$ sed '4 s/danger/safety/' testfile.txt
To zastąpi tylko ciąg z 4 linii pliku. Możemy również wymienić zakres linii zamiast pojedynczej linii,
$ sed '4,9 s/danger/safety/' testfile.txt
Przykład :12) Dodaj linię po/przed dopasowanym wyszukiwaniem
Aby dodać nową linię z jakąś treścią po każdym dopasowaniu wzorca, użyj opcji 'a',
$ sed '/danger/a "This is new line with text after match"' testfile.txt
Aby dodać nową linię z jakąś treścią a przed każdym dopasowaniem wzorca, użyj opcji 'i',
$ sed '/danger/i "This is new line with text before match" ' testfile.txt
Przykład :13) Zmiana całej linii z dopasowanym wzorcem
Aby zmienić całą linię na nową, kiedy wzorzec wyszukiwania pasuje, musimy użyć opcji 'c' z sed,
$ sed '/danger/c "This will be the new line" ' testfile.txt
Więc kiedy wzorzec pasuje do 'danger', cała linia zostanie zmieniona na wspomnianą linię.
Zaawansowane opcje z sed
Do tej pory używaliśmy tylko prostych wyrażeń z sed, teraz omówimy kilka zaawansowanych zastosowań sed z regex,
Przykład :14) Uruchamianie wielu poleceń sed
Jeśli potrzebujemy wykonać wiele wyrażeń sed, możemy użyć opcji 'e' do łańcuchowego wykonywania poleceń sed,
$ sed -e 's/danger/safety/g' -e 's/hate/love/' testfile.txt
Przykład :15) Tworzenie kopii zapasowej przed edycją pliku
Aby utworzyć kopię zapasową pliku przed jego edycją, użyj opcji '-i.bak',
$ sed -i.bak -e 's/danger/safety/g' testfile.txt
To utworzy kopię zapasową pliku z rozszerzeniem .bak. Możesz również użyć innego rozszerzenia, jeśli chcesz.
Przykład :16) Usuwanie linii pliku zaczynającej się od & kończącej się wzorcem
Aby usunąć linię zaczynającą się od określonego ciągu znaków & kończącą się innym ciągiem znaków, użyj
$ sed -e 's/^danger.*stops$//g' testfile.txt
To usunie linię z 'danger' na początku & 'stops' na końcu & to może mieć dowolną liczbę słów pomiędzy , '.*' definiuje tę część.
Przykład :17) Dodawanie linii
Aby dodać trochę treści przed każdą linią z sed & regex, użyj
$ sed -e 's/.*/testing sed &/' testfile.txt
Teraz każda linia będzie miała 'testowanie sed' przed nią.
Przykład :18) Usuwanie wszystkich komentowanych linii & pustych linii
Aby usunąć wszystkie komentowane linie tj. linie z # & wszystkie puste linie, użyj
$ sed -e 's/#.*//;/^$/d' testfile.txt
Aby usunąć tylko skomentowane linie, użyj
$ sed -e 's/#.*//' testfile.txt
Przykład :19) Uzyskaj listę wszystkich nazw użytkowników z pliku /etc/passwd
Aby uzyskać listę wszystkich nazw użytkowników z pliku /etc/passwd, użyj
$ sed 's/\(*\).*/\1/' /etc/passwd
Kompletna lista wszystkich nazw użytkowników zostanie wygenerowana na ekranie jako wyjście.
Przykład :20) Zapobieganie nadpisywaniu linków systemowych komendą sed
Komenda 'sed -i' jest znana z tego, że usuwa linki systemowe & tworząc tylko zwykłe pliki w miejsce pliku z linkami. Więc aby uniknąć takiej sytuacji & uniemożliwić poleceniu 'sed -i' niszczenie linków, użyj opcji '-follow-symklinks' w wykonywanym poleceniu.
Załóżmy, że chcę wyłączyć SELinux w CentOS lub RHEL Severs
# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux