Konfiguracja dla przykładów sed
Oto krótki przewodnik, jak przygotować się do przykładu, którego postaram się nie przesadzać.
słowajest plikiem tekstowym zawierającym liczby od 1 do 100. Jeśli nie masz pewności co do polecenia, które 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.
barto plik tekstowy zawierający jedną linię —.
stary-phpjest plikiem tekstowym zawierającym 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 '$(( LOSOWE % 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 -I 's / 0 // g'-6. Konwertuj plik csv na tsv (odpowiednik tr ‘,’ ‘ ’ -)
sed -I 's/,/ /g'-7.Dołącz linię do pliku (odpowiednik paska kota -)
sed '$ a ---'-8. Dołącz wiersz do pliku (odpowiednik cat – bar)
sed '1i---'-9. Wydrukuj wszystkie linie w pliku (odpowiednik cat -)
sed -n -I 'P'-10. Wydrukuj linie pasujące do wzorca (odpowiednik grep -e ‘^1’ -)
sed -n -I '/^1/p'-11. Usuń linie pasujące do wzorca (odpowiednik grep -v -e ‘^1’ -)
sed -I '/^1/d'-12. Uzyskaj liczbę wierszy w pliku (odpowiednik wc -l -)
sed -n -I '$ ='-13. Napisz do pliku w tle (odpowiednik tee poleceń)
sed 'w$ {1}'-Przykład użycia sed do wykonania polecenia tee
Tuż powyżej znajduje się przykład oznaczony napisem Zapis do pliku w tle. Dźwięki przypominające komendę tee. No cóż, tak jest. Tutaj rozwiniemy, jak zaimplementować funkcję zastępującą tee w bash za pomocą sed.
Polecenia
trójnik (){
test $ {#} -równe 1 || powrót;
sed 'w$ {1}'-
}
Główny()
trójnikten;
Kotten
Główny
Wyjście
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. Pierwsza 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 dane wejściowe będą przesyłane z zewnątrz.
Polecenia
jakaś linia(){
funkcjonowaćlc()
{
sed -n -I '$ ='-
};
funkcjonowaćlinia druku()
{
sed -n -I '$ {1}P'-
};
temp= $( mktemp );
Kot-> ${temp};
Kot ${temp} |linia druku $((LOSOWY%$( Kot ${temp} |lc)+1 ));
rm ${temp}
}
Przykładowe użycie (1)
następny 100 |_Wyjście (1)
35Przykładowe użycie (2)
zwijanie https://linuxhint.pl/bash_cut_command/ --cichy |paski-tagi|jakaś liniaZobacz poniższy przykład, używając sed do usuwania znaczników HTML. Zauważ, że przykład over 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 bash 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 '$ {1}P'-
}
Zobaczmy teraz, co się stanie, gdy użyjemy print-line na słowach.
Polecenia
słowa|linia drukupięćdziesiątWyjście
pięćdziesiątW porządku. Wygląda dobrze, ale spróbujmy czegoś, co wygląda trochę mniej trywialnie.
Polecenia
ogłosić -xfsłowaogłosić -xflinia druku
następny 1 10$(słowa| toaleta -ten ) | xargs-igrzmotnąć -C 'słowa | linia druku {}'
Wyjście
1jedenaście
dwadzieścia jeden
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 -I 's/^/#/'-Usuń pierwszą linię
sed -I „1d”-
Kasowaćostatnilinia
sed -I „$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 -I 's /†*.//g'-
Uaktualnij eregwstary kod php do uruchomieniawphp7 lub nowszy
sed 's/ereg(([^,]*).([^)]*)./strpos(2,1)/g'
SprawdzaćJeśli sedjest wcześniejsza niż określona wersja
sed -I „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-co-najwyżej() {wyrzucił -n | sed 'v'$ {1}'-2> /dev/zero
}
wersja próbna()
{
wyrzucił -n 'Wersja$ {1}. W porządku. Zrób to;
test-sed-wersja-co-najwyżej$ {1} && {
wyrzucił -n 'stary';
prawda
} || {
wyrzucił -n 'Nowy'
};
wyrzucił ' sposób.'
}
Główny()
{
lokalnyv;
dlavw 4.{4,5};
robić
wersja próbna$ {v};
Gotowe
}
Główny
Wyjście
Wersja4.4. W porządku. Zrób to po staremu.Wersja4,5. W porządku. Zrób to w nowy sposób.
Zauważ, że wersja seda 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 była 4,7, około 3 lata starsza od tej, którą mam. Mój sed jest stary! W rzeczywistości, w sed 4.0.6, do komendy version został dodany parametr, więc ta strategia działa dla każdej wspomnianej wersji co najmniej 4.0.6, która jest łagodna, biorąc pod uwagę, że wersja została wydana na początku 2003 roku. 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óra zrzuca skrypt i dodaje adnotacje do linii wyjściowych. Umożliwiłoby to przetłumaczenie skryptów seda generowanych przez funkcje w bashu do postaci kanonicznej. Fajny! Tylko nie zapominaj, że potrzebujesz rozgałęzień wersji sed w bash. W tym miejscu 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 basha i użyjmy jej do usunięcia wszystkich tagów HTML z ostatniego artykułu, który napisałem.
Polecenia
paski-tagi(){
sed -I 's /†*.//g'-
}
zwijanie https://linuxhint.pl/bash_cut_command/ --cichy |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 dokonane za pomocą seda z opcją -i są nieodwracalne. To znaczy, chyba że jesteś całkowicie pewien, jaki tekst ma zostać zastąpiony, prawdopodobnie skończysz z jednym znakiem 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źć
- chwyt
- sed
odnaleźć
Tutaj wybierasz pliki, które mają podlegać wymianie. Proponuję użyć polecenia w następujący sposób:
odnaleźć -rodzajF-Nazwa | chwyt -v-I| xargs-i ...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.
odnaleźć -rodzajF-Nazwa*.php| chwyt -v -I '.wybrać się' | xargs -i...Przeczytaj więcej na temat polecenia xargs w bash .
chwyt
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.
odnaleźć -rodzajF-Nazwa*.php| chwyt -v -I '.wybrać się' |xargs -i chwyt -Ijakiś_wzór-lub
Powyższe polecenie powinno zwrócić listę ciągów pasujących do jakiegoś_wzoru.
sed
Na koniec chcemy zastąpić wszystkie łańcuchy pasujące do jakiegoś_wzorzec. Aby to zrobić, musimy przekonwertować grep na sed w następujący sposób.
odnaleźć -rodzajF-Nazwa*.php| chwyt -v -I '.wybrać się' |xargs -i sed -i -Is/jakiś_wzór/wymiana/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ą zastąpione 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 |
-i | Edycja na miejscu. Jeśli dane wejściowe są plikiem (nie wprowadzonym), wynik wyrażeń nadpisze zawartość pliku. Sed akceptuje jeden np. sed -n … |
-I | -e oznacza ekspresję. Jego parametrem jest wyrażenie w języku sed. Sed akceptuje wiele np. sed -e'wyraż1' -e'wyraż2'
|
-n | Ukrywa linię, na którą nie ma wpływu wyrażenie. To znaczy, 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 polecenia są zawarte w przykładach sed z równoważnymi poleceniami.
- sortować
- głowa
- ogon
- chwyt
- Kot
- NS
- trójnik
Przypis końcowy na końcu – na przykład równoważne polecenia
Jeśli zastanawiasz się, co się dzieje 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,
Kotjakiś plik| sortować -R-| głowa -1Jednak gdy polecenie po lewej stronie potoku jest obecne, możemy pominąć podpowiedź w następujący sposób.
Kotjakiś plik| sortować -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(){
następny 100
}
bar()
{
wyrzucił ---
}
stary-php()
{
wyrzucił 'ereg ($ UA,' Bottybot ')'
}
Dolna linia
Lubiłem pisać przykłady 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.