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ę.