Wstęp

Wstęp

Witamy w drugiej części naszej serii, część, która skupi się na SED, wersji GNU. Jak zobaczysz, istnieje kilka wariantów SED, które są dostępne dla kilku platform, ale skupimy się na wersjach GNU SED 4.X. Wielu z was już słyszało o SED i już go używało, głównie jako narzędzie zastępcze. Ale to tylko segment tego, co SED może zrobić, a my dołożymy wszelkich starań, aby pokazać wam jak najwięcej tego, co możesz z tym zrobić. Nazwa oznacza edytor strumienia, a tutaj „Stream” może być plik, rurą lub po prostu stdin. Oczekujemy, że będziesz mieć podstawową wiedzę Linuksa, a jeśli już pracowałeś z wyrażeniami regularnymi lub przynajmniej wiesz, czym jest Regexp, tym lepiej. Nie mamy miejsca na pełny samouczek w wyrażeniach, więc zamiast tego damy tylko podstawowy pomysł i wiele przykładów SED. Istnieje wiele dokumentów dotyczących tego tematu, a nawet będziemy mieć zalecenia, jak zobaczysz za minutę.

Instalacja

Nie ma tu wiele do powiedzenia, ponieważ masz już zainstalowane SED, ponieważ jest używany w różnych skryptach systemowych i nieocenionym narzędziu w życiu użytkownika Linuksa, który chce być wydajny. Możesz przetestować, jaką wersję masz, pisząc

 $ sed --version

W moim systemie to polecenie mówi mi, że mam sed 4.2.1 zainstalowany oraz linki do strony głównej i innych przydatnych rzeczy. Pakiet nosi nazwę po prostu „sed” niezależnie od dystrybucji, ale jeśli Gentoo oferuje sed w sposób domyślny, uważam, że oznacza to, że możesz być pewny.

Pojęcia

Zanim przejdziemy dalej, uważamy, że ważne jest wskazanie Co Dokładnie tak, że SED, ponieważ „Edytor strumienia” może nie zadzwonić zbyt wiele dzwonków. SED przyjmuje tekst wejściowy, czy określone operacje w każdym wierszu (chyba że określono inaczej) i drukuje zmodyfikowany tekst. Określone operacje mogą być dołączane, wstawienie, usuwanie lub zastąpienie. Nie jest to tak proste, jak może się wydawać: bądź ostrzeżony, że istnieje wiele opcji i kombinacji, które mogą sprawić, że polecenie SED są dość trudne do strawienia. Więc jeśli chcesz użyć SED, zalecamy poznanie podstaw Regexps, a resztę możesz złapać resztę. Zanim zaczniemy samouczek, chcemy podziękować Ericowi Pementowi i innym za inspirację i za to, co zrobił dla każdego, kto chce się uczyć i użyć sed.



Wyrażenia regularne

Ponieważ polecenia/skrypty SED stają się tajemnicze, uważamy, że nasi czytelnicy muszą zrozumieć podstawowe pojęcia zamiast ślepego kopiowania i wklejania poleceń, nie znają znaczenia. Kiedy chce się zrozumieć, czym jest RegexP, kluczowe słowo to „dopasowanie”. Lub jeszcze lepiej, „dopasowanie wzoru”. Na przykład w raporcie dla swojego działu HR napisałeś nazwę Nicka, odnosząc się do architekta sieciowego. Ale Nick ruszył dalej, a John przyszedł, by zająć jego miejsce, więc teraz musisz zastąpić słowo Nick Janem. Jeśli plik nazywa się raport.txt, możesz to zrobić

 Raport $ CAT.txt | sed 's/nick/john/g'> raport_new.tekst

Domyślnie SED używa stdout, więc możesz użyć operatora przekierowania skorupy, jak w naszym przykładzie poniżej. To najprostszy przykład, ale zilustrowaliśmy kilka punktów: dopasowaliśmy wzór „Nick” i zastępujemy wszystkie przypadki „John”. Zauważ, że SED jest wrażliwy na wielkość liter, więc bądź ostrożny i sprawdź plik wyjściowy, aby sprawdzić, czy dokonano wszystkich substancji. Powyższe mogło być napisane również w ten sposób:

 Raport $ s/nick/John/g '.TXT> Report_new.tekst

Ok, ale gdzie są wyrażenia regularne, pytasz? Cóż, najpierw chcieliśmy zmoczyć twoje stopy koncepcją dopasowania i oto interesująca część.

Jeśli nie jesteś pewien, czy napisałeś „Nick” przez pomyłkę zamiast „Nick” i chcesz to również dopasować, możesz użyć SED/Nick | Nick/John/G '. Pionowy pasek ma to samo znaczenie, które możesz wiedzieć, jeśli użyłeś C, to znaczy wyrażenie pasuje Lub nacięcie. Jak zobaczysz, rury może być również używana na inne sposoby, ale „znaczenie pozostanie. Inni operatorzy szeroko stosowani w regularności są ”?', które pasują do zera lub jednego instancji poprzedniego elementu (Flavou?r będzie pasował do smaku i smaku), „*” oznacza zero lub więcej i „+” pasuje do jednego lub więcej elementów. „^” odpowiada początkowi sznurka, podczas gdy „$” robi coś przeciwnego. Jeśli jesteś użytkownikiem vi (m), niektóre z tych rzeczy mogą wyglądać znajomo. W końcu te narzędzia wraz z AWK lub C mają swoje korzenie na początku Unix. Nie będziemy już nalegać na ten temat, ponieważ sprawy staną się prostsze, czytając przykłady, ale powinieneś wiedzieć, że istnieją różne implementacje regularności: POSIX, POSIX rozszerzone, perl lub różne implementacje wyrażeń regularnych rozmytych, gwarantowane, aby dać Ty ból głowy.



przykłady sed

Nauka polecenia Linux SED z przykładami
Składnia polecenia Linux Opis polecenia Linux
Raport SED/Nick/John/G '.tekst
W raporcie zastąp każde zdarzenie Nicka.tekst
Raport SED/Nick | Nick/John/G '.tekst
Zastąp każde zdarzenie Nicka lub Nicka Janem.
sed 's/^//' plik.txt> file_new.tekst
Dodaj 8 przestrzeni po lewej stronie tekstu do ładnego drukowania.
sed -n '/oczywiście/,/uwaga cię \
Pay/P 'Myfile

Wyświetl tylko jeden akapit, zaczynając od „Oczywiście”

i zakończenie „uwagi zwracasz”

plik sed -n 12,18p.tekst
Pokaż tylko wiersze 12-18 pliku.tekst
SED 12 18D Plik.tekst
Pokaż wszystkie pliki.TXT, z wyjątkiem linii od 12 do 18
plik sed g.tekst 
Plik podwójnej przestrzeni.tekst
skrypt sed -f.plik SED.tekst
Napisz wszystkie polecenia w skrypcie.sed je i wykonaj
sed '5!plik S/Ham/Cheese/'.tekst
Wymień szynkę z serem w pliku.txt, z wyjątkiem 5. linii
plik sed '$ d'.tekst
Usuń ostatnią linię
sed '/[0-9] \ 3 \/p'.tekst
Drukuj tylko linie z trzema kolejnymi cyframi
sed '/boom/!plik s/aaa/bb/'.tekst
O ile nie zostanie znalezione boom, wymień AAA na BB
plik sed '17,/dysk/d '.tekst
Usuń wszystkie linie od wiersza 17 na „dysk”
Echo One dwa | sed "s/one/unos/i"

Zastępuje jeden na UOS w sposób bezsensowny przypadek,

Więc wydrukuje „UNOS dwa”

sed „g; g”.tekst
Potrójna przestrzeń plik
sed 's/.plik $ // '.tekst
Sposób na wymianę DOS2Unix 🙂
sed 's/ ^[ ^t]*//'.tekst
Usuń wszystkie przestrzenie przed każdą linią pliku.tekst
sed 's/[ ^t]*$ //'.tekst
Usuń wszystkie przestrzenie na końcu każdej linii pliku.tekst
sed 's/ ^[ ^t]*//; s/[ ^]*$ //' plik.tekst

Usuń wszystkie przestrzenie z przodu i na końcu każdej linii

pliku.tekst

plik s/foo/bar/'.tekst
Wymień FOO na pasek tylko w pierwszej instancji w linii.
plik s/foo/bar/4 '.tekst
Wymień foo na pasek tylko dla czwartej instancji w linii.
plik s/foo/bar/g '.tekst 
Wymień foo na pasek dla wszystkich instancji w linii.
plik sed '/baz/s/foo/bar/g'.tekst
Tylko jeśli linia zawiera baz, zastąp foo barem
sed '/./,/^$/!plik d '.tekst
Usuń wszystkie kolejne puste linie, z wyjątkiem EOF
sed '/^$/n;/\ n $/d'.tekst

Usuń wszystkie kolejne puste linie, ale pozwala

Tylko górna pusta linia

sed '/./, $!plik d '.tekst
Usuń wszystkie wiodące puste linie
sed -e: a -e '/^\ n*$/$ d; n;;/\ n $/ba' \
plik.tekst
Usuń wszystkie puste linie
sed -e: a -e '/\\ $/n; s/\\\ n //; ta '\
plik.tekst

Jeśli plik kończy się na backslash, dołącz do następnego (przydatne

dla skorupy)

sed '/regex/,+5/expr/'
Dopasuj Regex plus następne 5 linii
SED „1 ~ 3D”.tekst
Usuń co trzecią linię, zaczynając od pierwszego
plik sed -n '2 ~ 5p'.tekst
Wydrukuj co 5 linii, zaczynając od drugiego
SED 'S/[nn] ick/John/g'.tekst

Inny sposób napisania powyższego przykładu.

Potrafisz zgadnąć który?

sed -n '/re/p; q;'.tekst

Wydrukuj tylko pierwszy mecz

RE (wyrażenie regularne)

sed '0,/re/// d;'.tekst
Usuń tylko pierwszy mecz
SED '0,/re/s // to_that/'.tekst
Zmień tylko pierwszy mecz
sed 's/^[^,]*,/9999,/'.CSV
Zmień pierwsze pole na 9999 w pliku CSV
s/^ *\ (.*[^] \) *$/| \ 1 |/;
s/" *, */" |/g;
: pętla
s/| *\ ([^", |] [^, |] *\) *, */| \ 1 |/g;
s/| *, */| \ 1 |/g;
T pętla
s/ *|/|/g;
s/| */|/g;
s/^| \ (.*\) | $/\ 1/;

Skrypt SED do konwersji pliku CSV na oddzielony bar

(Działa tylko na niektórych rodzajach CSV,

z osadzonymi „S i przecinkami)

sed ': a; s/\ (^\ | [^0-9.] \) \ ([0-9] \+\) \\
([0-9] \ 3 \ \)/\ 1 \ 2, \ 3/g; ta 'plik.tekst
Zmień liczby z pliku.TXT od 1234.56 Forma do 1.234.56
sed -r "s/\<(reg|exp)[a-z]+/\U&/g"
Konwertuj dowolne słowo, zaczynając od Reg lub EXP na wielką część
SED „1,20 ​​S/Johnson/White/G”.tekst

Zastąpienie Johnsona tylko białym

Linie między 1 a 20

sed '1,20 !plik s/Johnson/White/g '.tekst
Powyższe odwrócone (dopasuj wszystkie oprócz linii 1-20)
sed '/from/,/do/s/\/magenta/g; \
s/\/cyjan/g; ' plik.tekst
Wymień tylko między „od” i „do”
sed '/endnotes:/, $ s/Schaff/herzog/g; \
S/Kraft/Ebbing/g; ' plik.tekst
Wymień tylko od słowa „Endnotes:” do EOF
sed '/./H; $!d;; x;/regex/!plik d '.tekst
Wydrukuj akapity tylko wtedy, gdy zawierają Regex
 sed -e '/./H; $!d; '-e' x;/re1/!D;\
/Re2/!d;/re3/!plik d '.tekst

Wydrukuj akapity tylko wtedy, gdy zawierają RE1,

RE2 i RE3

 sed ': a; /\\ $/n; s/\\\ n //; plik Ta '.tekst

Połącz dwie linie w pierwszych końcach w operatorze

 sed 's/14 "/czternaście cali/g'.tekst

W ten sposób możesz użyć podwójnych cytatów

 sed 's/\/some \/unix \/ścieżka/\/a \/new \\
/plik/g '.tekst

Praca ze ścieżkami UNIX

 sed 's/[a-g] // g'.tekst

Usuń wszystkie znaki z A do G z pliku.tekst

sed 's/\ (.*\) FOO/\ 1BAR/'.tekst
Wymień tylko ostatni mecz FOO z barem
sed '1!G; H; $!D' 
Zamiennik TAC
sed '/\ n/!G; s/\ (.\) \ (.*\ n \)/& \ 2 \ 1 \
/; // d; s/.// '
Zamiennik obrotowy
plik sed 10q.tekst
Zamiennik głowy
sed -e: a -e '$ q; n; 11, $ d; ba' \
plik.tekst
Zamiennik ogona
sed '$!N; /^\ (.*\) \ n \ 1 $/!P; D' \
plik.tekst
Zamiennik Uniq
sed '$!N; s/^\ (.*\) \ n \ 1 $/\ 1/; \ \
T; Plik d '.tekst
Odwrotny (lub równoważny Uniq -d)
sed '$!N; $!Plik d '.tekst
Równoważny ogon -n 2
plik sed -n '$ p'.tekst
… Tail -n 1 (lub ogon -1)
sed '/regexp/!plik d '.tekst
grep równoważny
sed -n '/regexp/g; 1!p;; h 'plik.tekst

Wydrukuj linię przed jedną pasującą RegExp, ale

nie ten zawierający RegexP

sed -n '/regexp/n; p;'.tekst
Wydrukuj linię po dopasowaniu RegexP, ale

nie ten zawierający RegexP

plik sed '/wzór/d'.tekst
Usuń wzór dopasowywania linii
sed '/./!plik d '.tekst
Usuń wszystkie puste wiersze z pliku
sed '/^$/n;/\ n $/n; // d'.tekst

Usuń wszystkie kolejne puste linie

Z wyjątkiem dwóch pierwszych

sed -n '/^$/p; h;;//./X;/./P;'\
plik.tekst
Usuń ostatni wiersz każdego akapitu
sed 's/.\ x08 // g '
Usuń NROFF OFERTRIKES
sed '/^$/q'
Zdobądź nagłówek poczty
sed '1,/^$/d'
Zdobądź ciało poczty
SED '/^Temat: */!D; s ///; q '
Zdobądź temat poczty
sed 's/^/>/'

Cytuj wiadomość pocztową, wkładając

„>” Przed każdą linią

sed 's/^> //'
Przeciwnie (wiadomość pocztowa bez wątpienia)
sed -e: a -e 's/]*> // g;/ 
Usuń znaczniki HTML
sed '/./H; d;; x; s/\ n/= nl =/g '\
plik.txt | sort \
|. sed '1s/= nl = //; s/= nl =/\ n/g'
Sortować akapity pliku.TXT alfabetycznie
sed@/usr/bin@&/local@g 'ścieżka.tekst
Zamień/usr/bin na/usr/bin/lokalny na ścieżce.tekst
sed@^.*$@<<>> @G 'ścieżka.tekst
Wypróbuj i zobacz 🙂
sed 's/\ (\/[^:]*\).*/\ 1/g 'ścieżka.tekst

Podana ścieżka.TXT zawiera ścieżkę $, to będzie

echo tylko pierwszą ścieżkę na każdej linii

sed 's/\ ([^:]*\).*/\ 1/'/etc/passwd

Wymiana AWK - wyświetla tylko użytkowników

Z pliku Passwd

Echo „Welcome to the Geek Stuff” | sed \
's/\ (\ b [a-z] \)/\ (\ 1 \)/g'
(W) elcome (t) o (t) he (g) eek (s) Tuff
Eksplanatoryjne
sed -e '/^$/,/^end/s/hills/\
plik gór/g '.tekst

Zmień „wzgórza” na „góry”, ale tylko na blokach

początkowego tekstu

z pustą linią i kończąc na początku linii

z trzema postaciami „koniec”, włączającymi

sed -e '/^#/d'/etc/usługi | więcej
Wyświetl plik usług bez skomentowanych wierszy
sed '$ s@\ ([^:]*\): \ ([^:]*\): \ ([^:]*\
\)@\ 3: \ 2: \ 1@g 'ścieżka.tekst
Odwrotna kolejność elementów w ostatniej linii ścieżki.tekst
sed -n -e '/regexp/=; x; 1!p; g; $!N; p; d; '\
-plik e h.tekst

Wydrukuj 1 linię kontekstu przed i po dopasowaniu linii,

z numerem linii, w którym następuje dopasowanie

sed '/regex/x; p; x;'.tekst
Włóż nową linię nad każdą linią pasującą do regularności
sed '/aaa/!D; /BBB/!D; /CCC/!plik d '.tekst
Mecz AAA, BBB i CCC w dowolnej kolejności
sed '/aaa.*BBB.*CCC/!plik d '.tekst
Mecz AAA, BBB i CCC w tej kolejności
sed -n '/^.\ 65 \/p '.tekst
Drukuj linie 65 zwariów długie lub więcej
sed -n '/^.\ 65 \/!plik p '.tekst
Drukuj linie 65 zwariów długich lub mniejszych
plik sed '/regex/g'.tekst
Włóż pustą linię poniżej każdej linii
sed '/regex/x; p; x; g;'.tekst
Włóż pustą linię powyżej i poniżej
sed = plik.txt | sed 'n; s/\ n/\ t/'
Linie liczbowe w pliku.tekst
sed -e: a -e 's/^.\ 1,78 \ $/\
&/; TA 'Plik.tekst
Wyrównaj ją do w prawo
sed -e: a -e 's/^.\ 1,77 \ $/ &/; ta '-e \
„S/\ ( *\) \ 1/\ 1/'.tekst
Wyrównać centrum tekstowe

Wniosek

To tylko część tego, co można powiedzieć o SED, ale ta seria ma być praktycznym przewodnikiem, więc mamy nadzieję, że pomoże ci odkryć moc narzędzi Unix i stać się bardziej wydajnym w pracy.

Powiązane samouczki Linux:

  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 22.04 JAMMY Jellyfish…
  • Rzeczy do zainstalowania na Ubuntu 22.04
  • Posłuchaj swojej ulubionej stacji radiowej z jednym poleceniem…
  • Hung Linux System? Jak uciec do wiersza poleceń i…
  • Ubuntu 20.04 Przewodnik
  • Mastering Bash Script Loops