Konfiguracja dla przykładów sed
Oto krótki przewodnik, jak przygotować się do przykładu, którego postaram się nie przesadzać.
„słowa” to plik tekstowy zawierający liczby od 1 do 100. Jeśli nie masz pewności co do polecenia, aby go utworzyć, zobacz Funkcja eksportu dla xargs w poleceniu eksportu Bash. Nigdy nie wiesz, że może to być na twoim następnym wywiadzie dotyczącym skryptów powłoki.
„bar” to plik tekstowy zawierający pojedynczą linię -.
„stary-php” to plik tekstowy zawierający wiersze starego PHP, które zepsują się w php7 lub nowszym. (Wskazówka: ereg)
Zwróć uwagę, że wszystkie opisane powyżej funkcje można znaleźć poniżej w Przypisie końcowym dotyczącym funkcji do konfiguracji.
Sed przykłady z równoważnymi poleceniami
W środowisku wiersza poleceń znajdziesz więcej niż jedno rozwiązanie danego zadania. Jednak w większości chcesz iść ścieżką, która daje najmniejszy opór. Oto lista przykładów poleceń seda z odpowiadającymi im poleceniami, z których niektóre zostaną szczegółowo omówione poniżej.
1. Wydrukuj losową linię (odpowiednik sort -R - | head -1)
sed -n "$(( LOSOWY % 100 ))p" -2.Wydrukuj ostatnią linię w pliku (odpowiednik nagłówka -1 -)
sed -n '$p' -3. Wydrukuj pierwsze 10 wierszy w pliku (odpowiednik nagłówka -n 10 -)
sed '10q' -4. Wydrukuj pierwszą linię w pliku (odpowiednik tail -1 -)
sed -n '1p' -5. Usuń wszystkie wystąpienia znaku (odpowiednik tr -delete '0' -, gdzie 0 to znak, który chcemy usunąć)
sed -e 's/0//g' -6. Konwertuj plik csv na tsv (odpowiednik tr ',"\t' -)
sed -e 's/,/\t/g' -7.Dołącz wiersz do pliku (odpowiednik cat bar -)
sed '$a ---' -8. Dołącz wiersz do pliku (odpowiednik cat - bar)
sed '1i ---' -9. Wydrukuj wszystkie wiersze w pliku (odpowiednik cat -)
sed -n -e 'p' -10. Wydrukuj linie pasujące do wzorca (odpowiednik grep -e '^1' -)
sed -n -e '/^1/p' -11. Usuń wiersze pasujące do wzorca (odpowiednik grep -v -e '^1' -)
sed -e '/^1/d' -12. Pobierz liczbę wierszy w pliku (odpowiednik wc -l -)
sed -n -e '$=' -13. Zapisz do pliku w tle (odpowiednik tee poleceń)
sed "w $1" -Przykład użycia sed do wykonania polecenia tee
Powyżej znajduje się przykład z napisem Zapis do pliku w tle. Rodzaje dźwięków jak polecenie tee. No cóż, tak jest. Tutaj rozwiniemy, jak zaimplementować funkcję zastępującą tee w bash za pomocą sed.
Polecenia
koszulka ()test $# -eq 1 || powrót;
sed "w $1" -
Główny ()
sekw. 10 | koszulka dziesięć;
kot dziesięć
Główny
Wynik
12
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
Tutaj zobaczysz dwie listy liczb całkowitych od 1 do 10. Pierwszy pochodzi z polecenia seq. Sekundę dostajemy od kota z pliku napisanego w tee. Wiem, że to śmieszne, ale działa!
Przykład użycia sed do wydrukowania losowej linii w pliku
Załóżmy, że chcemy wydrukować losową linię w pliku za pomocą basha i odrobiny sed. Możemy to zrobić? Tak możemy! Oto jak.
Zaimplementuj funkcję, która
- Pobiera liczbę wierszy w pliku, L
- Generuje losową liczbę od 1 do L, R
- Drukuje R
Funkcja oczekuje, że wejście zostanie przesłane z zewnątrz.
Polecenia
pewna linia ()funkcja lc ()
sed -n -e '$=' -
;
funkcja print-line ()
sed -n -e "$1p" -
;
temp=$( mktemp );
kot -> $temp;
kot $temp | print-line $(( LOSOWY % $( cat $temp | lc ) + 1 ));
$temp
Przykładowe użycie (1)
seq 100 | _Wyjście (1)
35Przykładowe użycie (2)
curl https://linuxhint.com/bash_cut_command/ --silent | paski-tagi | jakaś liniaZobacz poniższy przykład, używając sed do usuwania tagów HTML. Zauważ, że powyższy przykład czasami zwraca puste dla pustych linii. Jako ćwiczenie można to poprawić.
Używanie sed do drukowania linii w pliku
Załóżmy, że chcesz zaimplementować w bashu funkcję, która wypisze daną linię z pliku. Próba wydrukowania pojedynczego wiersza w pliku za pomocą pętli w bash, head, tail lub awk to zbyt dużo pracy, aby wydrukować wiersze w pliku. Dobrze, że mamy sed. Wynikowa funkcja używająca sed wyglądałaby następująco.
Polecenia
linia druku ()sed -n "$1p" -
Zobaczmy teraz, co się stanie, gdy użyjemy print-line na słowach.
Polecenia
słowa | linia druku 50Wynik
50w porządku. Wygląda dobrze, ale spróbujmy czegoś, co wygląda trochę mniej trywialnie.
Polecenia
zadeklaruj -xf słowazadeklaruj -xf print-line
seq 1 10 $( słowa | wc -l ) | xargs -i bash -c "słowa | linia druku "
Wynik
111
21
31
41
51
61
71
81
91
w porządku. Teraz to jest bardziej podobne! Widzisz, jak sed może być użyty w skrypcie basha do wypisania dowolnego wiersza w pliku.
Sed przykłady bez równoważnych poleceń
W środowisku wiersza poleceń czasami droga do rozwiązania przynoszącego najmniejszy opór jest drogą sed; w przeciwnym razie wykonujesz więcej pracy, niż jest to wymagane w pierwszej kolejności. Niektóre polecenia mogą być przedstawione poniżej.
Poleć wszystkim wierszom w skrypcie powłoki
sed -e 's/^/#/' -Usuń pierwszą linię
sed -e '1d' -
Usuń ostatnią linię
sed -e '$ d' -
Wstaw linię przed liniami pasującymi do wzorca
sed '/0$/i ---' -
Wstaw linię po liniach pasujących do wzorca
sed '/0$/ ---' -
Usuń tagi HTML
sed -e's/<[^>]*.//sol' -
Zaktualizuj ereg w starym kodzie php, aby działał w php7 lub nowszym
sed's/ereg(\([^,]*\).\([^)]*\)./strpos(\2,\1)/g'
Sprawdź, czy sed jest wcześniejszy niż określona wersja
sed -e 'v 4.5' -
Przykładowe rozgałęzienie wersji seda w bash
Powyżej w przykładach znajduje się wiersz sprawdzający, czy sed jest wcześniejszy niż określona wersja, której możemy użyć do zaimplementowania rozgałęzienia wersji w bash, co moim zdaniem jest łatwiejsze niż próba zaimplementowania funkcji do porównywania numerów wersji z danych wyjściowych sed -version. Jedyną pułapką jest to, że jeśli istnieje wcześniejsza wersja seda, która nie obsługuje polecenia v, to mamy kłopoty.
Polecenia
test-sed-wersja-na-najbardziej()echo -n | sed "v $1" - 2>/dev/null
wersja próbna ()
echo -n "Wersja $1. w porządku. Zrób to ";
test-sed-wersja-co najwyżej $1 &&
echo -n "stary";
prawdziwe
||
echo -n "nowy"
;
echo „droga."
Główny ()
lokalne v;
dla v w 4.4,5;
zrobić
wersja próbna $v;
gotowy
Główny
Wynik
Wersja 4.4. w porządku. Zrób to po staremu.Wersja 4.5. w porządku. Zrób to w nowy sposób.
Zwróć uwagę, że wersja sed uruchomiona na moim komputerze w momencie wpisywania tych znaków to 4.4, co wyjaśnia powyższe dane wyjściowe. W tym samym czasie najnowsza wersja gnu sed to 4.7, około 3 lata starszy od mojego. Mój sed jest stary! W rzeczywistości w sed 4.0.6, parametr został dodany do polecenia wersji, więc ta strategia działa dla każdego wymienionego co najmniej v4.0.6, co jest łagodne, biorąc pod uwagę, że wersja została wydana na początku 2003 r. Jesteś dobry.
Zrobiłem dodatkowe kopanie, właściwie czytając NEWS z najnowszego kodu źródłowego. Wersja 4.6 ma nową funkcję, -debug, który zrzuca skrypt i dodaje adnotacje do linii wyjściowych. Umożliwiłoby to przetłumaczenie skryptów seda generowanych przez funkcje w bashu na formę kanoniczną. Chłodny! Tylko nie zapominaj, że potrzebujesz rozgałęzienia wersji sed w bash. I tu pojawia się ten przykład sed.
Przykładowa funkcja bash wykorzystująca sed do usuwania tagów HTML
W powyższych przykładach znajduje się linia do usuwania tagów HTML. Wrzućmy to do funkcji bash i użyjmy jej do usunięcia wszystkich tagów HTML z ostatniego artykułu, który napisałem.
Polecenia
paski-tagi ()sed -e's/<[^>]*.//sol' -
curl https://linuxhint.com/bash_cut_command/ --silent | paski-tagi
Nie mogę powiedzieć, że jest idealny, ale przynajmniej jest czytelny w terminalu.
Przykłady Sed z przepływami pracy: Przykładowy przepływ pracy: bezpiecznie zastępuj wszystko za pomocą find, grep i sed
Można śmiało powiedzieć, że zmiany wprowadzone za pomocą seda z opcją -i są nieodwracalne. To znaczy, o ile nie masz całkowitej pewności, jaki tekst ma zostać zastąpiony, prawdopodobnie otrzymasz o jeden znak mniej niż zamierzano. Dlatego w tym przykładzie użyjemy sed w przepływie pracy, aby bezpiecznie zastąpić tekst we wszystkich wybranych plikach.
Przepływ pracy
- odnaleźć
- grep
- sed
odnaleźć
Tutaj wybierzesz pliki do wymiany. Proponuję użyć polecenia w następujący sposób:
znajdź -type f -name | grep -v -e | xargs -ja…Na przykład, możesz chcieć ograniczyć pliki do zastąpienia plików PHP, wyłączając katalogi repozytorium git w następujący sposób.
find -type f -name \*.php | grep -v -e '.git' | xargs -ja…Przeczytaj więcej o poleceniu xargs w bash.
grep
Następnie spróbujemy dopasować some_pattern w wybranych plikach w następujący sposób. Zauważ, że ponieważ używamy opcji -o dla grep, dane wyjściowe pokażą tylko pasujący łańcuch, jeśli taki istnieje.
find -type f -name \*.php | grep -v -e '.git' |xargs -i grep -e jakiś_wzorzec -o
Powyższe polecenie powinno zwrócić listę ciągów pasujących do jakiegoś_wzoru.
sed
Na koniec chcemy zastąpić wszystkie ciągi pasujące do jakiegoś_wzoru. Aby to zrobić, musimy przekonwertować grep na sed w następujący sposób.
find -type f -name \*.php | grep -v -e '.git' |xargs -i sed -i -e s/jakiś_wzorzec/zamiennik/g
Polecenie grep zmieni się na sed -i, a opcja -o zostanie usunięta. I masz to.
Teraz możesz wcześniej sprawdzić, jakie struny zostaną wymienione w sed, zamiast sprawdzać swoje szczęście.
Przypisy końcowe dotyczące opcji użytych w przykładach
Oto lista opcji użytych w omówionych pokrótce przykładach sed.
Opcja | Opis |
-ja | Edytuj na miejscu. Jeśli dane wejściowe to plik (nie wprowadzony), wynik wyrażeń nadpisze zawartość pliku. Sed akceptuje jeden np. sed -n… |
-mi | -e oznacza ekspresję. Jego parametrem jest wyrażenie w języku sed. Sed akceptuje wiele np. sed -e 'wyraż1' -e 'wyraż2'…
|
-nie | Ukrywa linię, na którą nie ma wpływu wyrażenie. Oznacza to, że jeśli wyrażenie jest instrukcją print w języku sed, to wiersze nie zawarte w instrukcji print nie zostaną uwzględnione w wyniku. np. sed -n…
|
Aby uzyskać więcej informacji o dostępnych opcjach sed, zobacz sed -help
Uwagi końcowe dotyczące równoważnych poleceń użytych w przykładach
Następujące narzędzia wiersza poleceń są zawarte w przykładach sed z równoważnymi poleceniami.
- sortować
- głowa
- ogon
- grep
- kot
- Tr
- trójnik
Przypis końcowy na końcu - w przykładzie równoważne polecenia
Jeśli zastanawiasz się, o co chodzi z postacią - w przykładzie, ta notatka jest dla Ciebie. Dodałem znak - po większości poleceń w przykładach, aby wskazać, że oczekujemy, że dane wejściowe będą odbierane przez potok. To jest,
kot jakiś plik | sortuj -R - | głowa -1Jednak gdy polecenie po lewej stronie potoku jest obecne, możemy pominąć podpowiedź w następujący sposób.
kot jakiś plik | sortuj -R | głowa -1Tak właśnie działo się ze znakiem - po komendach w przykładach.
Przypisy końcowe dotyczące funkcji konfiguracji
Jeśli szukasz, oto funkcje do konfiguracji powyższych przykładów. Wynik uzyskany za pomocą deklaracji -f. Przeczytaj więcej na temat polecenia deklaracji w bash, aby uzyskać więcej zastosowań.
Polecenia
słowa ()kolejne 100
bar ()
Echo ---
stary-php ()
echo 'ereg($UA,"Bottybot")'
Dolna linia
Podobał mi się pisanie przykładów Bash sed, a nawet po drodze zdobyłem kilka dodatkowych sztuczek. Sed to potężne narzędzie wiersza poleceń i ekspresyjny język do manipulowania plikami tekstowymi. Jeśli lubisz uczyć się o sed, nie martw się, jest jeszcze wiele do poruszenia. Sed na.