W poprzednim poście, rozmawialiśmy o funkcjach basha i jak ich używać z linii poleceń bezpośrednio, i widzieliśmy kilka innych fajnych rzeczy. Dzisiaj porozmawiamy o poręcznym narzędziu do manipulacji ciągami znaków zwanym sed lub sed Linux command.
Używamy sed do pracy z plikami tekstowymi takimi jak pliki dziennika, pliki konfiguracyjne i inne pliki tekstowe.
W tym poście skupimy się na sed Linux command, które jest używane do manipulacji tekstem, co jest niezbędnym krokiem w naszej podróży skryptowej bash.
System Linux dostarcza pewnych narzędzi do przetwarzania tekstu; jednym z tych narzędzi jest sed.
Przedyskutujemy 31+ przykładów z obrazkami, aby pokazać wyjście każdego przykładu.
Spis treści
Zrozumienie polecenia sed Linux
Polecenie sed jest nieinteraktywnym edytorem tekstu. Polecenie sed Linux edytuje dane na podstawie reguł, które podasz; możesz go używać w ten sposób:
$ sed options file
Nie jesteś ograniczony do używania sed do manipulowania plikami; stosujesz go do STDIN bezpośrednio, w ten sposób:
$ echo "Welcome to LikeGeeks page" | sed 's/page/website/'

Komenda s zastępuje pierwszy tekst drugim wzorcem tekstowym. W tym przypadku zastąpiliśmy ciąg „website” słowem „page”.
Powyższy przykład był prostym przykładem demonstrującym działanie narzędzia. Możemy użyć linuksowego polecenia sed również do manipulowania plikami.
Stwórzmy przykładowy plik :

$ sed 's/test/another test/' ./myfile
Wyniki są wypisywane na ekran natychmiast; nie musisz czekać na przetworzenie pliku do końca.
Jeśli twój plik jest wystarczająco duży, zobaczysz wynik zanim przetwarzanie zostanie zakończone.
Komenda Sed Linux nie aktualizuje twoich danych. Wysyła jedynie zmieniony tekst do STDOUT. Plik jest nadal nietknięty. Jeśli potrzebujesz nadpisać istniejącą zawartość, możesz sprawdzić nasz poprzedni post, który mówił o przekierowaniach.
Używanie wielu poleceń sed Linux w wierszu poleceń
Aby uruchomić wiele poleceń sed, możesz użyć opcji -e w ten sposób:
$ sed -e 's/This/That/; s/test/another test/' ./myfile

Musisz oddzielić polecenia sed średnikiem bez żadnych spacji.
Możesz również użyć pojedynczego cytatu do oddzielenia poleceń w ten sposób:
$ sed -e '> s/This/That/> s/test/another test/' myfile

Ten sam rezultat, nic wielkiego.
Odczytywanie poleceń z pliku
Możesz zapisać swoje polecenia sed w pliku i używać ich, podając plik za pomocą opcji -f.
$ cat mycommandss/This/That/s/test/another test/
$ sed -f mycommands myfile

Zastępowanie flag
Przyjrzyjrzyj się uważnie poniższemu przykładowi:
$ cat myfile
$ sed 's/test/another test/' myfile

Powyższy wynik pokazuje, że zastąpiliśmy pierwsze wystąpienie w każdej linii. Aby zastąpić wszystkie wystąpienia wzorca, należy użyć jednej z poniższych flag zastępowania.
Flagi możemy zapisać w ten sposób:
s/pattern/replacement/flags
Istnieją cztery rodzaje zastępowania:
- g, zastąp wszystkie wystąpienia.
 - Liczba, numer wystąpienia nowego tekstu, który ma zostać zastąpiony.
 - p, drukuj oryginalną treść.
 - w plik: oznacza zapisanie wyników do pliku.
 
Możesz ograniczyć zastępowanie przez określenie numeru wystąpienia, które powinno być zastąpione w ten sposób:
$ sed 's/test/another test/2' myfile

Jak widzisz, zastąpiliśmy tylko drugie wystąpienie w każdej linii.
Flaga g oznacza global, co oznacza globalne zastąpienie wszystkich wystąpień:
$ sed 's/test/another test/g' myfile

Flaga p drukuje każdą linię zawierającą dopasowanie wzorca, możesz użyć opcji -n, aby wydrukować tylko zmodyfikowane linie.
$ cat myfile
$ sed -n 's/test/another test/p' myfile

Flaga w zapisuje dane wyjściowe do określonego pliku:
$ sed 's/test/another test/w output' myfile

Wypisaliśmy dane wyjściowe na ekranie, ale pasujące linie zapisaliśmy do pliku wyjściowego.
Zastępowanie znaków
Przypuśćmy, że chcesz wyszukać powłokę bash i zastąpić ją powłoką csh w pliku /etc/passwd za pomocą sed, cóż, możesz to zrobić w prosty sposób:
$ sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
Oh!!! to wygląda okropnie.
Na szczęście jest inny sposób, aby to osiągnąć. Możesz użyć wykrzyknika (!) jako ogranicznika łańcucha znaków, jak poniżej:
$ sed 's!/bin/bash!/bin/csh!' /etc/passwd
Teraz jest to łatwiejsze do odczytania.
Ograniczanie sed
Polecenie sed przetwarza cały plik. Możesz jednak ograniczyć polecenie sed do przetwarzania konkretnych linii; istnieją dwa sposoby:
- Zakres linii.
 - Wzorzec, który pasuje do konkretnej linii.
 
Możesz wpisać jedną liczbę, aby ograniczyć ją do konkretnej linii:
$ sed '2s/test/another test/' myfile

Zmodyfikowaliśmy tylko linię drugą.
A co z użyciem zakresu linii:
$ sed '2,3s/test/another test/' myfile

Możemy też zacząć od linii do końca pliku:
$ sed '2,$s/test/another test/' myfile

Albo możemy użyć wzorca jak poniżej:
$ sed '/likegeeks/s/bash/csh/' /etc/passwd

Absolutnie!!
Możesz użyć wyrażeń regularnych do napisania tego wzorca, aby był bardziej ogólny i użyteczny.
Usuwanie linii
Aby usunąć linie używając sed, możesz użyć flagi delete (d) jest twoim przyjacielem.
Flaga delete usuwa tekst ze strumienia, nie z oryginalnego pliku.
$ sed '2d' myfile

Tutaj usuwamy tylko drugą linię z myfile.
A co z usuwaniem zakresu linii?
$ sed '2,3d' myfile

Tutaj usuwamy zakres linii, drugą i trzecią.
Inny typ zakresów:
$ sed '3,$d' myfile

Tutaj usuwamy od trzeciej linii do końca pliku.
Wszystkie te przykłady nigdy nie modyfikują twojego oryginalnego pliku.
$ sed '/test 1/d' myfile

Tutaj używamy wzorca do usunięcia linii, jeśli jest dopasowany w pierwszej linii.
Jeśli chcesz usunąć zakres wierszy, możesz użyć dwóch wzorców tekstowych, takich jak ten:
$ sed '/second/,/fourth/d' myfile

Usunęliśmy od drugiego do czwartego wiersza.
Wstawianie i dołączanie tekstu
Możesz wstawiać i dołączać linie tekstu używając następujących flag:
- Flaga (i).
 - Flaga (a).
 
$ echo "Another test" | sed 'i\First test '

Dodaliśmy tekst przed podaną linią.
$ echo "Another test" | sed 'a\First test '

Dodaliśmy tekst po wskazanej linii.
A co z dodawaniem tekstu w środku?
Proste, spójrz na poniższy przykład:
$ sed '2i\This is the inserted line.' myfile

I tak samo działa dodawanie, ale spójrz na pozycję dodawanego tekstu:
$ sed '2a\This is the appended line.' myfile

Użyliśmy tych samych flag, ale z lokalizacją wstawiania lub dołączania.
Modyfikowanie linii
Aby zmodyfikować konkretną linię, możesz użyć flagi (c) w ten sposób:
$ sed '3c\This is a modified line.' myfile

Możesz użyć wzorca wyrażenia regularnego, a wszystkie linie pasujące do tego wzorca zostaną zmodyfikowane.
$ sed '/This is/c Line updated.' myfile

Przekształcanie znaków
Flaga transform (y) działa na takie znaki jak poniżej:
$ sed 'y/123/567/' myfile

Zastosowaliśmy transformację do wszystkich danych i nie możemy ograniczyć jej do konkretnego wystąpienia.
Wydruk numerów linii
Numer linii można wydrukować używając znaku (=) w ten sposób:
$ sed '=' myfile

Jednakże używając -n w połączeniu ze znakiem równości, polecenie sed wyświetla numer linii, która zawiera dopasowanie.
$ sed -n '/test/=' myfile

Odczyt danych z pliku
Możesz użyć flagi (r) do odczytania danych z pliku.
Możesz zdefiniować numer linii lub wzór tekstu, który chcesz odczytać.
$ cat newfile
$ sed '3r newfile' myfile

Wstawiliśmy treść po trzeciej linii zgodnie z oczekiwaniami.
A to jest użycie wzorca tekstowego:
$ sed '/test/r newfile' myfile

Cool right?
Przydatne przykłady
Załóżmy, że mamy plik, który zawiera tekst z placeholderem, i mamy inny plik, który zawiera dane, które wypełnią placeholder w innym pliku.
Użyjemy flag (r) i (d) do wykonania zadania.
Słowo DATA w tym pliku jest placeholderem dla prawdziwej zawartości, którą będziemy przechowywać w innym pliku o nazwie data.
Zastąpimy je rzeczywistą zawartością:
$ Sed '/DATA>/ {r newfiled}' myfile

Absolutnie!!! jak widzisz, wypełniliśmy miejsce placeholder danymi z innego pliku.
To jest tylko małe wprowadzenie do polecenia sed. Polecenie sed Linux to inny świat sam w sobie.
Jedynym ograniczeniem jest twoja wyobraźnia.
Mam nadzieję, że łatwo ci będzie manipulować ciągami znaków za pomocą polecenia sed Linux.
Dziękuję.
Założyciel LikeGeeks. Pracuję jako administrator systemu Linux od 2010 roku. Jestem odpowiedzialny za utrzymanie, zabezpieczanie i rozwiązywanie problemów z serwerami Linux dla wielu klientów na całym świecie. Uwielbiam pisać skrypty w powłoce i Pythonie, aby zautomatyzować moją pracę.