sed

Przykłady Bash Sed

Przykłady Bash Sed
Bash umożliwia zastępowanie wzorców za pomocą rozwijania zmiennych, np. ($zmienna/wzór/zastąpienie). A więc, czy sed wygląda tak (sed -e 's/pattern/replacement/'). 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ł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

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

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

35

Przykładowe użycie (2)

curl https://linuxhint.com/bash_cut_command/ --silent | paski-tagi | jakaś linia

Zobacz 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 50

Wynik

50

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

Polecenia

zadeklaruj -xf słowa
zadeklaruj -xf print-line
seq 1 10 $( słowa | wc -l ) | xargs -i  bash -c "słowa | linia druku "

Wynik

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

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

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

Jednak 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 -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 ()

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.

AppyMouse On-screen Trackpad and Mouse Pointer for Windows Tablets
Tablet users often miss the mouse pointer, especially when they are habitual to using the laptops. The touchscreen Smartphones and tablets come with m...
Middle mouse button not working in Windows 10
The middle mouse button helps you scroll through long webpages and screens with a lot of data. If that stops, well you will end up using the keyboard ...
How to change Left & Right mouse buttons on Windows 10 PC
It's quite a norm that all computer mouse devices are ergonomically designed for right-handed users. But there are mouse devices available which are s...