logo

Polecenie Sed w systemie Linux/Unix z przykładami

Polecenie „sed” w systemie Linux oznacza edytor strumieniowy. Służy do edycji strumieni (plików) za pomocą wyrażeń regularnych. Ale ta edycja nie jest trwała. Pozostaje tylko na wyświetlaczu, ale w rzeczywistości zawartość pliku pozostaje taka sama.

Przede wszystkim służy do zastępowania tekstu; dodatkowo można go używać do innych operacji manipulacji tekstem, takich jak wstawianie, usuwanie, wyszukiwanie i inne. Polecenie sed pozwala nam edytować pliki bez ich otwierania. Obsługa wyrażeń regularnych sprawia, że ​​jest to potężniejsze narzędzie do manipulacji tekstem.

Omówienie polecenia sed

Jest to narzędzie uniksowe, które przekształca i analizuje tekst za pomocą zwartego i prostego języka programowania. Został zintegrowany w latach 1973–1974 przez Lee E. McMahona z Bell Labs i jest dziś obecny w prawie każdym systemie operacyjnym. Polecenie sed zostało oparte na skryptowych aspektach wcześniejszego qed (szybkiego edytora) i interaktywnego edytora ed. Było to najwcześniejsze narzędzie do obsługi wyrażeń regularnych i pozostaje aktywne do przetwarzania tekstu, przede wszystkim za pomocą polecenia podstawienia. Znane alternatywne narzędzia obejmują Perl i AWK dla „edycja strumienia” i manipulowanie ciągami znaków w postaci zwykłego tekstu.

Tryb działania polecenia sed

Polecenie sed to narzędzie do przetwarzania tekstu zorientowanego liniowo: wiersz po wierszu odczytuje tekst z pliku lub strumienia wejściowego do wewnętrznego bufora zwanego przestrzenią wzorców. Wszystkie odczyty linii rozpoczynają cykl. Polecenie sed wykorzystuje jedną lub wiele operacji, które zostały opisane skryptem sed do przestrzeni wzorców. Obsługuje język programowania wykorzystujący około 25 poleceń opisujących operacje na tekście.

Dla wszystkich wierszy wejściowych polecenie sed zwykle powoduje wyświetlenie przestrzeni wzorca i po wykonaniu skryptu rozpoczyna cykl od następnego wiersza. Inne natury końca skryptu są dostępne w poleceniach skryptu i ustawianiu opcji, np. N, aby natychmiast włączyć następną linię do przestrzeni wzorców, q, aby wyjść, d, aby usunąć przestrzeń wzorców i tak dalej. Dlatego skrypt sed odnosi się do treści pętli, która iteruje od linii usprawnienia, w której zmienna pętli i sama pętla są utrzymywane i niejawne przez sed.

kwartał w biznesie
  • Skrypt sed można opisać w wierszu poleceń lub przeczytać w izolowanym pliku. W skrypcie sed polecenia mogą przyjmować dodatkowy adres w kontekście wyrażeń regularnych lub numerów linii. Adres decyduje o tym, kiedy polecenie zostanie wykonane. Na przykład 2d wykona polecenie d (lub usuń) tylko w drugiej linii wejściowej, podczas gdy /^ /d usunie każdą linię zaczynającą się od spacji.
  • Przestrzeń wstrzymania, izolowany specjalny bufor, może być używana przez niektóre polecenia sed do przechowywania gromadzącego się tekstu pomiędzy cyklami. Język poleceń sed ma tylko dwie zmienne (przestrzeń wzorców i przestrzeń wstrzymania) oraz funkcjonalność rozgałęziania podobną do GOTO. Jednak język jest kompletny w Turingu. Ezoteryczne skrypty sed są dostępne dla kilku gier, takich jak tetris, szachy, arkanoid i sokoban.
  • Główna pętla działa dla wszystkich linii strumienia wejściowego, sprawdzając skrypt sed we wszystkich liniach wejścia. Wszystkie linie skryptu sed stanowią parę wzorzec-akcja, reprezentującą jaki wzorzec ma zostać dopasowany i jaką akcję należy zaimplementować, co można skopiować jako instrukcję warunkową. Domyślne akcje (drukowanie przestrzeni wzorca, kopiowanie linii do przestrzeni wzorca), strumienie wejściowe i wyjściowe oraz zmienne robocze (przestrzeń wstrzymania i przestrzeń wzorca) są ukryte; możliwe jest określenie zwięzłych programów jednowierszowych ze względu na pętlę główną.

Użycie polecenia sed

    Polecenie podstawienia
    Poniższy przykład przedstawia większość poleceń i typowe użycie polecenia sed, tj. podstawienie. Użycie było faktyczną motywacją dla polecenia sed:
    sed 's/regexp/replacement/g' nazwa_pliku wejściowego > nazwa_pliku wyjściowegoInne polecenia sed
    Możliwe są także inne sposoby prostego przetwarzania za pomocą około 25 poleceń sed. Na przykład poniżej użyto opcji d do odfiltrowania linii zawierających tylko spacje i koniec linii:
    sed '/^ *$/d' nazwapliku wejściowego
    W powyższym przykładzie wykorzystano kilka z poniższych metaznaków wyrażeń regularnych:
    • Karetka (^) jest taka sama jak początek linii.
    • Symbol dolara ($) oznacza zakończenie linii.
    • Gwiazdka (*) oznacza wystąpienie znaku poprzedzającego o więcej lub zero.
    • Symbol plus (+) jest taki sam, jak jedno lub wiele poprzednich wystąpień znaku.
    • Znak zapytania (?) jest tym samym, co wystąpienie znaku poprzedzającego o więcej lub zero.
    • Symbol kropki (.) jest dokładnie taki sam jak jeden znak.
    sed jako filtr
    Często polecenie sed jest używane jako filtr wewnątrz potoku w systemie Unix:
    $generujDane | sed 's/x/y/g'
    Program generateData generuje dane, a polecenie sed wprowadza niewielką zmianę, zastępując x zamiast y.Skrypty sed oparte na plikach
    Często pomocne jest umieszczenie wielu poleceń sed, po jednym w każdym wierszu, w pliku skryptu i użycie opcji -f w celu wykonania poleceń z pliku:
    sed -f subst.sed nazwapliku wejściowego > nazwapliku wyjściowego

Składnia:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

Opcje:

Poniżej przedstawiono niektóre opcje wiersza poleceń polecenia sed:

-n, --quiet, --silent: To na siłę pozwala nam wydrukować przestrzeń wzoru.

-e skrypt, --expression=skrypt: Służy do dodawania skryptu do poleceń, które mają zostać wykonane.

-f plik-skryptu, --file=plik-skryptu: Służy do dodawania zawartości pliku skryptu do poleceń, które mają zostać wykonane.

--follow-symlinks: służy do podążania za dowiązaniami symbolicznymi podczas przetwarzania na miejscu.

-i[SUFIKS], --in-place[=SUFIKS]: służy do lokalnej edycji plików (tworzy kopię zapasową, jeśli podano opcję SUFFIX).

-l N, --line-length=N: Służy do określenia żądanej długości zawijania linii dla polecenia `l'.

--posix: służy do wyłączania wszystkich rozszerzeń GNU.

-E, -r, --regexp-extended: Pozwala nam to na użycie rozszerzonych wyrażeń regularnych w skrypcie (dla przenośności użyj POSIX -E).

rhel kontra centos

-s, --separate: służy do rozpatrywania plików jako oddzielnych, a nie pojedynczych i stanowi kontynuację długiego strumienia.

--piaskownica: Służy do pracy w trybie piaskownicy.

-u, --niebuforowany: Służy do ładowania minimalnych ilości danych z plików wejściowych i częściej opróżnia bufory wyjściowe.

-z, --null-data: Służy do oddzielania linii znakami NUL.

--pomoc: służy do wyświetlania instrukcji pomocy.

--wersja: Służy do wyświetlania informacji o wersji.

Przykłady poleceń sed

Zobaczmy następujące przykłady:

Stosowanie do katalogu STDIN

Polecenie sed nie ogranicza się tylko do manipulowania plikami; możemy również zastosować go do katalogu STDIN.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

Powyższe polecenia zastąpią pierwszy tekst drugim wzorcem tekstowym. Rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Na podstawie powyższego wyniku najpierw wykonaliśmy polecenie „sed” na łańcuchu „class7”, gdzie „klasa” zostaje zamieniona na „jtp”, a 7 na 10. Następnie wykonaliśmy polecenie „sed” na strumieniu „msg.txt” ' gdzie „uczyć się” zamienia się na „studiować”.

Globalna wymiana

We wcześniejszym przykładzie wszystkie słowa „uczyć się” nie zostały zamienione na „uczyć się”. Aby edytować każde słowo, musimy użyć globalnego zamiennika „g”. Edytuje wszystkie określone słowa w pliku lub ciągu znaków.

Składnia:

 command | sed 's///g' 

Rozważ poniższe przykłady:

 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

Powyższe polecenia zastąpią cały określony wzór tekstu. Rozważ poniższe dane wyjściowe:

rozmiar czcionki, lateks
Filtr Sed dla Linuksa

Z powyższych wyników, wykonując polecenie „echo class7 class9 | sed 's/class/jtp/g'' cała 'klasa' jest konwertowana na 'jtp' i za pomocą polecenia 'cat msg.txt | sed „s/learn/study/g” całe „learn” zostało zamienione na „study”.

Usuwanie linii

Opcja „d” pozwoli nam usunąć całą linię z pliku. Wystarczy, że za pomocą opcji „d” określimy słowo z tej linii, a linia ta zostanie usunięta. Pamiętaj jednak, że wszystkie linie zawierające to samo słowo zostaną usunięte. Zostanie wykonane jako:

 cat | sed '//d' 

Rozważ poniższe polecenie:

 cat msg.txt | sed '/jtp/d' 

Powyższe polecenie usunie linie zawierające słowo „jtp”. Rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Z powyższych wyników, wykonując polecenie „cat msg.txt | sed '/jtp/d'' wszystkie linie zawierające słowo 'jtp' zostaną usunięte.

Korzystanie z polecenia Multiple sed

Opcja „-e” pozwala nam wykonać wiele poleceń sed jednocześnie. Możemy wykonać więcej niż jedną operację sed, wykonując polecenie jako:

 sed -e ' ; ' 

Rozważ poniższe polecenie:

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

Powyższe polecenie zastosuje wszystkie określone operacje w pliku „exm.txt”. Rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Jak widać z powyższego wyniku, wszystkie „czerwone” słowa są zastępowane przez „niebieskie”, a wszystkie „żółte” słowa są zastępowane przez „czarne”. Możemy również rozdzielić polecenia w ten sposób:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

Wynik będzie taki sam jak powyższe polecenie.

Odczytywanie poleceń z pliku

Możemy zapisać polecenia sed w pliku i zastosować je od razu w dowolnym pliku. Można to zrobić, określając opcję „-f” w następujący sposób:

 sed -f 

Z powyższego polecenia „” to plik zawierający listę poleceń sed. Rozważ poniższe polecenie:

 sed -f SedCommands exm.txt 

Powyższe polecenie zastosuje wszystkie określone polecenia w pliku „SedCommand” w „exm.txt”. Rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Z powyższych wyników użyliśmy poleceń zastosowanych we wcześniejszym przykładzie. Zatem wynik jest taki sam jak w poprzednim przykładzie.

ile miast jest w nas

Zamiana znaków

Możemy użyć wykrzyknika (!) jako ogranicznika ciągu. Na przykład chcemy zastąpić powłokę bash i zastąpić ją powłoką csh w pliku „/etc/passwd”. Aby to zrobić, wykonaj poniższe polecenie:

 sed 's//bin/bash//bin/csh/' /etc/passwd 

Ten sam wynik możemy osiągnąć, wykonując poniższe polecenie:

 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

Ograniczenie sed

Podstawowe użycie polecenia sed przetwarza cały plik. Możemy jednak ograniczyć polecenie sed i określić dowolną linię. Istnieją dwa sposoby ograniczenia polecenia sed:

  • Zakres linii.
  • Wzór pasujący do określonej linii.

Możemy podać liczbę określającą linię w następujący sposób:

 sed '3s/Red/Blue/' exm.txt 

Powyższe polecenie zastosuje określoną operację w trzeciej linii. Rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Z powyższego wyniku modyfikowana jest tylko linia trzecia.

Możemy także określić zakres linii. Aby określić zakres linii, wykonaj następujące polecenie:

 sed '1,3s/Red/Blue/' exm.txt 

Powyższe polecenie zaktualizuje określony tekst w liniach 1 i 3. Rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Wstawianie i dołączanie tekstu

Flagi „i” i „a” służą do wstawiania i dołączania tekstu do pliku. Flaga „i” doda tekst przed ciągiem, a flaga „a” służy do dodania tekstu po ciągu. Rozważ poniższe polecenie:

 echo 'Another Demo' | sed 'iFirst Demo' 

Powyższe polecenie wstawi tekst przed tekstem „Kolejne demo”. Rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Aby dodać tekst, wykonaj polecenie w następujący sposób:

 echo 'Another Demo' | sed 'aFirst Demo' 

Powyższe polecenie dołączy tekst. Rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Modyfikowanie linii

Flaga „c” służy do modyfikowania określonej linii. Aby zmodyfikować linię, wykonaj następujące polecenie:

 sed '3cThis is a modified line.' exm.txt 

Powyższe polecenie zaktualizuje linię trzecią. Rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Możemy również użyć wyrażenia regularnego, aby zaktualizować więcej niż jedną linię o tym samym wzorze. Rozważ poniższe polecenie:

 sed '/Apple is /c Line updated.' exm.txt 

Powyższe polecenie zaktualizuje wszystkie linie zawierające ciąg „Apple is”. Rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Transformacja postaci

Flaga „y” służy do przekształcania znaków. Transformacja postaci nie może ograniczać się do konkretnych zdarzeń. Aby przekształcić znaki, wykonaj następujące polecenie:

 sed 'y/abc/def/' exm.txt 

Powyższe polecenie przekształci znaki „a”, „b”, „c” w „d”, „e”, „f”. rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Drukowanie numerów linii

Znak „=” służy do drukowania numeru linii. Aby wydrukować numer linii, wykonaj następujące polecenie:

 sed '=' exm.txt 

Powyższe polecenie wyświetli numer linii zawartości pliku. Rozważ poniższe dane wyjściowe:

co to jest ini pulpitu
Filtr Sed dla Linuksa

Znak równości z opcją „-n” określa numer wiersza zawierającego pasujący skrypt. Rozważ poniższe dane wyjściowe:

 sed -n '/mango/=' exm.txt 

Powyższe polecenie wyświetli numer linii zawierającej słowo „mango”. Rozważ poniższe dane wyjściowe:

Filtr Sed dla Linuksa

Z powyższych danych wynika, że ​​w wierszu nr 2 znajduje się słowo „mango”.