Jak używać Sed w systemie Linux

Jak używać Sed w systemie Linux
Zdjęcie dwóch monitorów komputerowych wyświetlających dużą ilość kodu.

Sed to prosty program UNIX, który nie tworzy ani nie edytuje plików. Modyfikuje tylko dane przechodzące przez jego wejście i prezentuje zmodyfikowane dane na wyjściu. Tutaj przyjrzymy się krótkiemu przeglądowi filozofii UNIX, przejdziemy przez podstawy korzystania z programu sedi pokażemy przykłady, jak używać programu do codziennych zadań.

Podstawy korzystania z Sed

Sed to program, który potrafi czytać i modyfikować strumienie danych tekstowych. Oznacza to, że w przeciwieństwie do zwykłego edytora tekstu, sed nie zmienia bezpośrednio plików na komputerze. Zamiast tego działa bardziej jak „filtr” dla przychodzących danych i pozwala na ich transformację w dowolny sposób.

Aby rozpocząć pracę z sed, najpierw utwórz plik z co najmniej pięcioma wierszami tekstu w środku. Upewnij się, że między wierszami znajduje się znak „nowej linii”:

Ogólne polecenie sed wygląda mniej więcej tak:

Jedną z najbardziej podstawowych funkcji w sed jest npodpolecenie. Działa ono poprzez odczyt danych z wejścia sed i umieszczenie ich w „przestrzeni wzorców” programu. Jest to specjalny bufor, który przechowuje cały przychodzący tekst, zanim sed wykona na nim jakąkolwiek manipulację:

Terminal pokazujący zawartość

Kolejną podstawową funkcją sed jest psubcommand. Podobnie jak n, odczytuje dane przychodzące z wejścia sed i umieszcza je w przestrzeni wzorców programu. Jednak również jawnie drukuje je na wyjściu twojego terminala.

Używanie ppodpolecenia może być mylące dla początkujących, ponieważ uruchomienie go z dowolnym tekstem wejściowym powoduje, że sed drukuje swoje dane wyjściowe dwa razy. Dzieje się tak, ponieważ domyślnie sed automatycznie drukuje swoją przestrzeń wzorca niezależnie od tego, czy pjest obecna, czy nie:

Terminal pokazujący wynik podpolecenia p bez flagi -n.

Aby wyłączyć to nietypowe zachowanie, dodaj -nflagę przed uruchomieniem podpoleceń sed:

Terminal pokazujący wynik podpolecenia p z włączoną flagą -n.

Mając już podstawy, w kolejnych sekcjach przyjrzymy się różnym sposobom wykorzystania sed do manipulowania danymi tekstowymi.

1. Wybieranie i przycinanie strumieni tekstowych

Oprócz drukowania, możesz również użyć sed do zaznaczania i przycinania tekstu zarówno ze strumieni danych, jak i plików. Najłatwiejszym sposobem na to jest dodanie wartości zakresu do podpolecenia p.

Poniższe polecenie wykorzystuje składnię zakresu sed do wydrukowania wierszy od trzeciego do piątego w pliku „hello.txt”:

Terminal pokazujący możliwość sed'a drukowania określonych zakresów linii.

Możesz również użyć ppodpolecenia, aby wydrukować nieprzylegające do siebie wiersze w tekście. Na przykład poniższe polecenie drukuje pierwszy i czwarty wiersz w pliku „hello.txt”:

Terminal pokazujący sed drukujący nie sąsiadujące ze sobą wiersze z pliku tekstowego.

2. Usuwanie tekstu ze strumienia Sed

Sed może również usuwać dane z dowolnego przychodzącego strumienia tekstowego. Jest to pomocne, jeśli chcesz usunąć kilka wierszy tekstu z dużego pliku lub wyczyścić dane wyjściowe programu, aby wyświetlać tylko potrzebne informacje.

Aby to zrobić, użyj dpodpolecenia wraz z konkretnym wierszem lub zakresem, który chcesz usunąć:

Terminal pokazujący proces usuwania niesąsiadujących ze sobą wierszy za pomocą sed.

Podobnie jak drukowanie wierszy tekstu, dpodpolecenie działa z zakresami wielowierszowymi. Na przykład, poniższe polecenie usunie pierwsze cztery wiersze z pliku „hello.txt”:

Terminal pokazujący proces usuwania zakresu wierszy za pomocą sed.

Oprócz dopasowania określonych zakresów wierszy, możesz użyć wyrażeń regularnych, aby znaleźć tekst, który chcesz usunąć. Spowoduje to, że sed poszuka wszystkich wierszy zawierających słowo „world” i je usunie:

Możesz również traktować wyrażenia regularne jako zakres dla swojego pliku wejściowego. Daje Ci to większą elastyczność w definiowaniu swoich wyborów w programie:

Terminal pokazujący możliwość seda do usuwania wierszy tekstu na podstawie wzorca wyrażenia regularnego.

3. Dodawanie nowego tekstu do strumieni Sed

Oprócz usuwania tekstu, sed jest również w stanie dodawać nowy tekst do istniejących strumieni danych. Chociaż nie jest to pełnoprawny edytor tekstu, ta funkcja może być przydatna do jednorazowych edycji i podstawowych dodawań tekstu.

Aby dodać nowy wiersz tekstu, uruchom sed z poleceniem, apo którym wpisz tekst, który chcesz dodać:

Terminal pokazujący proces dodawania pojedynczej linii tekstu na końcu strumienia sed.

Można również dołączyć całe pliki do strumienia tekstowego sed. Aby to zrobić, użyj polecenia, rpo którym następuje nazwa pliku, który chcesz dodać:

Terminal pokazujący proces dodawania całego pliku na końcu strumienia sed.

4. Znajdowanie i zastępowanie tekstu w Sed

Jedną z najpotężniejszych funkcji sed jest możliwość wyszukiwania i zastępowania tekstu w strumieniu tekstowym. W przeciwieństwie do dodawania i usuwania tekstu, pozwala to na dynamiczną edycję danych podczas ich przechodzenia przez potoki UNIX, co czyni go o wiele bardziej elastycznym w porównaniu ze zwykłym edytorem tekstu.

Zacznij od przetestowania wydruku wprowadzonego tekstu bez żadnych modyfikacji z poziomu sed:

Terminal drukujący zawartość

Zastąp ppodpolecenie poleceniem s, a następnie dodaj po nim trzy ukośniki odwrotne (/):

Wstaw strukturalne wyrażenie regularne ciągu znaków, który chcesz dopasować, pomiędzy pierwszym i drugim ukośnikiem odwrotnym. Na przykład mogę umieścić następującą wartość, aby wyszukać słowa zaczynające się od „wo” w moim ciągu wejściowym:

Umieść kursor tekstowy pomiędzy drugim i trzecim ukośnikiem odwrotnym, a następnie podaj tekst, którym chcesz zastąpić swoje dopasowania. W przeciwieństwie do poprzedniej kolumny, ta sekcja nie używa strukturalnych wyrażeń regularnych:

Domyślnie sed zastępuje tylko pierwszy ciąg, który pasuje do konkretnego wiersza. Może to być problematyczne, jeśli chcesz zastąpić każde wystąpienie słowa w strumieniu tekstu. Aby to naprawić, dodaj opcję gpo trzecim ukośniku odwrotnym swojego wyrażenia:

Terminal pokazujący podpolecenie podstawiania w sed.

5. Kopiowanie danych tekstowych do przestrzeni przytrzymywania

Sed używa dwóch buforów do przechowywania danych tekstowych: przestrzeni wzorca i przestrzeni przechowywania. Pierwszy służy jako tymczasowe miejsce dla tekstu przechodzącego przez wyrażenia sed. Tymczasem drugi działa jako schowek, w którym można przechowywać dowolne dane tekstowe.

Jedną z zalet tego podejścia jest to, że pozwala ono „przechowywać” pewne dane wyjściowe bez polegania na zewnętrznych programach. Może to być przydatne, jeśli planujesz używać sed do przetwarzania wieloetapowych manipulacji tekstem.

Aby zacząć korzystać ze spacji, najpierw upewnij się, że masz plik zawierający przynajmniej kilka wierszy tekstu:

Zastąp ppodpolecenie przez h, a następnie podaj numer wiersza lub wartość wyrażenia regularnego, którą sed dopasuje do pliku. Spowoduje to, że sed weźmie ten konkretny wiersz tekstu i skopiuje go do swojej przestrzeni przechowywania:

Możesz również użyć Hpodpolecenia, aby zapisać wiele wierszy tekstu w swojej przestrzeni wstrzymania. Na przykład poniższe polecenie zapisuje trzeci i czwarty wiersz mojego pliku tekstowego i drukuje je z powrotem do terminala:

Terminal pokazujący proces przechowywania wielu wierszy tekstu w sed

6. Używanie etykiet do tworzenia pętli w Sed

Chociaż sed nie jest wszechstronnym językiem programowania, nadal możliwe jest tworzenie pętli wewnątrz programu. Jest to przydatne, jeśli potrzebujesz wyrażenia sed, które musi ciągle przechodzić przez konkretny fragment tekstu wejściowego.

Aby utworzyć pętlę w sed, musisz najpierw utworzyć etykietę dla swojego wyrażenia sed. W tym celu musisz użyć podpolecenia, :a następnie etykiety, której chcesz użyć dla swojego wyrażenia.

Podaj kryteria dopasowania dla swojego wyrażenia sed. W moim przypadku chcę, aby dotarło do końca każdego wiersza w moim tekście wejściowym:

Wpisz podpolecenia sed, które chcesz uruchomić, gdy sed znajdzie dopasowanie, a następnie ujęto je w nawiasy klamrowe. Poniższe polecenie łączy dwa sąsiadujące wiersze, zastępuje znak nowej linii spacją, a następnie wraca do początku wyrażenia:

Terminal pokazujący proces usuwania znaków nowej linii za pomocą etykiet sed w pętlach.

Możesz nawet rozszerzyć to tak, aby pasowało do niemal każdego rodzaju tekstu wejściowego. Na przykład poniższe polecenie używa rozszerzonej funkcji regex sed, aby usunąć znaczniki HTML z tekstu wejściowego:

Terminal pokazujący polecenie sed usuwające znaczniki HTML z pliku za pomocą pętli.

7. Wprowadzanie trwałych zmian w Sed

Podobnie jak każde inne narzędzie UNIX, sed może korzystać z przekierowania wyjścia i potoków. Nie tylko pozwala to na sklejenie sed z innymi programami, ale także daje możliwość trwałego wprowadzenia zmian.

Poniższy wiersz kodu tworzy nowy plik „welcome.txt” z wyniku mojego polecenia sed:

Terminal pokazujący możliwość seda do przekierowywania wyjścia w celu zapisywania danych wyjściowych do plików.

Oprócz przekierowania wyjścia możesz również użyć wbudowanej -iflagi, aby edytować bieżący plik zamiast wyprowadzać zmiany w konsoli terminala. Na przykład poniższe polecenie usuwa wszystkie znaki nowej linii z mojego pliku tekstowego i zapisuje go:

Terminal pokazujący flagę -i w sed, która umożliwia programowi

Jeśli cała ta rozmowa wzbudziła Twoją ciekawość w kwestii wiersza poleceń Linuksa. Możesz przeczytać nasz wcześniejszy artykuł, w którym omawiamy niektóre z najciekawszych poleceń Bash, z których możesz korzystać już dziś.

Źródło obrazu: Morgan Richardson przez Unsplash . Wszystkie zmiany i zrzuty ekranu autorstwa Ramces Red.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *