Przykłady Bash Sed

Bash Sed Examples



Bash umożliwia zastępowanie wzorców za pomocą rozwijania zmiennych, np. (${zmienna/wzorzec/zastąpienie}). A więc sed robi to w ten sposób (sed -e ‘s/wzór/zastąpienie/’). Jednak sed to coś więcej niż zastępowanie wzorców w plikach tekstowych. Tutaj ponownie odkryjemy sed, na przykład, z równoważnymi poleceniami i przepływami pracy, które pomogą w codziennych zadaniach.

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

1
2
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

  1. Pobiera liczbę wierszy w pliku, L
  2. Generuje losową liczbę od 1 do L, R
  3. 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)

35

Przykładowe użycie (2)

zwijanie https://linuxhint.pl/bash_cut_command/ --cichy |paski-tagi|jakaś linia

Zobacz 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ąt

Wyjście

pięćdziesiąt

W porządku. Wygląda dobrze, ale spróbujmy czegoś, co wygląda trochę mniej trywialnie.

Polecenia

ogłosić -xfsłowa
ogłosić -xflinia druku
następny 1 10$(słowa| toaleta -ten ) | xargs-igrzmotnąć -C 'słowa | linia druku {}'

Wyjście

1
jedenaś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

  1. odnaleźć
  2. chwyt
  3. 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 -1

Jednak gdy polecenie po lewej stronie potoku jest obecne, możemy pominąć podpowiedź w następujący sposób.

Kotjakiś plik| sortować -R | głowa -1

Tak 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.