Jak sprawdzić, czy ciąg Bash zawiera podciąg w systemie Linux?

Jak sprawdzić, czy ciąg Bash zawiera podciąg w systemie Linux?

Czasami w skryptach linuksowych trzeba wiedzieć, czy ciąg tekstowy zawiera pewien mniejszy ciąg. Istnieje wiele sposobów, aby to zrobić. Pokażemy Ci kilka prostych i niezawodnych metod.

Dlaczego jest to przydatne?

Zwykłym wymaganiem jest znalezienie mniejszego podciągu w ciągu. Jednym z przykładów może być odczytanie tekstu z pliku lub danych wejściowych człowieka i wyszukanie określonego podciągu w ciągu, aby skrypt mógł zdecydować, co dalej. Może to być etykieta urządzenia lub wyszukiwanie nazwy w pliku konfiguracyjnym lub wyszukiwanie w wierszu poleceń w wierszu wejściowym użytkownika.

Użytkownicy Linuksa są wyposażeni w wiele narzędzi do pracy z tekstem. Niektóre z nich są wbudowane w powłokę Bash, inne są dostarczane jako osobne narzędzia lub aplikacje. Jest powód, dla którego systemy operacyjne wywodzące się z Uniksa są bogato wyposażone w możliwości manipulacji ciągami znaków.

Niektóre rzeczy, które wydają się być plikami, to nie tylko pliki. Są to specjalne pliki, które reprezentują takie elementy, jak urządzenia sprzętowe i źródła informacji systemowych. Abstrakcja wykonywana przez system operacyjny nadaje im wygląd i charakterystykę plików. Można z nich czytać informacje – oczywiście jako tekst – iw niektórych przypadkach pisać do nich, ale nie są to zwykłe pliki.

Tekst jest również używany jako dane wejściowe i wyjściowe poleceń w oknie terminala. Umożliwia to przekierowywanie i przekazywanie danych wejściowych i wyjściowych. Ta funkcjonalność leży u podstaw możliwości łączenia sekwencji poleceń systemu Linux razem, przekazując dane wyjściowe jednego polecenia jako dane wejściowe do następnego.

Bez względu na pochodzenie, wyszukiwanie w otrzymanym tekście znaczącego słowa, polecenia, etykiety lub innego wskaźnika jest standardową częścią pracy z danymi tekstowymi. Oto zestaw prostych sztuczek, które możesz włączyć do własnych skryptów.

Znajdowanie podciągów za pomocą wbudowanych funkcji Bash

Test porównania ciągów w podwójnych nawiasach „ [[...]]” może być użyty w ifinstrukcjach do określenia, czy jeden ciąg zawiera inny ciąg.

Skopiuj ten skrypt do edytora i zapisz go w pliku o nazwie „double.sh”.

#!/bin/bash

if [[ „małpa”= *”klucz”* ]]; następnie

echo „klucz jest w małpie”

w przeciwnym razie

echo „klucz nie jest w małpie”

fi

Będziesz musiał uczynić skrypt wykonywalnym za pomocą chmodpolecenia. Jest to krok, który jest zawsze niezbędny, aby każdy skrypt był wykonywalny. Będziesz musiał to zrobić za każdym razem, gdy tworzysz plik skryptu. W każdym przypadku zastąp odpowiednią nazwą skryptu.

chmod +x double.sh

tworzenie pliku wykonywalnego skryptu za pomocą chmod

Uruchommy skrypt.

./double.sh

Uruchamianie skryptu double.sh

Działa to, ponieważ gwiazdka „ *” reprezentuje dowolną sekwencję znaków, w tym brak znaków. Jeśli podciąg „klucz” znajduje się w ciągu docelowym, z lub bez żadnych znaków przed lub po nim, test zwróci true.

W naszym przykładzie podciąg poprzedzony jest znakami. Odpowiadają pierwszej gwiazdki. Za podciągiem nie ma żadnych liter, ale ponieważ gwiazdka również nie pasuje do żadnego znaku, test nadal przechodzi.

Aby zapewnić elastyczność, możemy zmodyfikować nasz skrypt, aby obsługiwał zmienne, a nie ciągi literowe. To jest skrypt „double2.sh”.

#!/bin/bash

string=”Małpa”

substring=”klucz”

if [[ $ciąg = *$podciąg* ]]; następnie

echo „Znaleziono $substring w $string”

w przeciwnym razie

echo „$substring nie został znaleziony w $string”

fi

Zobaczmy, jak to działa.

./double2.sh

Uruchamianie skryptu double2.sh

Działa to w ten sam sposób, z tą zaletą, że możemy używać nazw zmiennych zamiast dosłownych ciągów. Przekształcenie naszego małego rozwiązania w funkcję zapewni największą elastyczność.

To jest skrypt „double3.sh”.

#!/bin/bash

shopt -s nocasematch

string=”Małpa”

substring=”Klucz”

kapitał=”Londyn”

check_substring()

{

if [[ $1 = *$2* ]]; następnie

echo „Znaleziono 2 $ w $1”

w przeciwnym razie

echo „$2 nie zostało znalezione w $1”

fi

}

check_substring „Małpa””klucz”

check_substring $string $substring

check_substring $string „banan”

check_substring "Wales"$capital

Wywołujemy naszą check_substringfunkcję za pomocą kombinacji zmiennych i łańcuchów literowych. Użyliśmy shopt z jego -sopcją (set), aby ustawić nocasematch, aby dopasowania nie uwzględniały wielkości liter.

Oto jak to działa.

./double3.sh

Uruchamianie skryptu double3.sh

Możemy również użyć gwiazdek wokół podciągu w caseoperatorach. To jest „case.sh”.

#!/bin/bash

shopt -s nocasematch

string=”wallaby”

substring=”ściana”

case $string in

*$podciąg*)

echo „Znaleziono $substring w $string”

;;

*)

echo „Nic nie pasuje: $string”

;;

esac

Używanie caseinstrukcji zamiast bardzo długich ifmoże ułatwić czytanie i debugowanie skryptów. Jeśli chcesz sprawdzić, czy łańcuch zawiera jeden z wielu możliwych podłańcuchów, casenajlepszym wyborem jest operator.

./case.sh

Uruchamianie skryptu case.sh

Znaleziono podciąg.

Znajdowanie podciągów za pomocą grep

Oprócz wbudowanych funkcji Bash, pierwszym narzędziem do wyszukiwania tekstu, którego prawdopodobnie będziesz potrzebować, jest grep. Możemy użyć grepwrodzonej zdolności wyszukiwania ciągu w ciągu, aby znaleźć nasze podciągi.

Ten skrypt nazywa się „subgrep.sh”.

#!/bin/bash

string=”garnek owsianki”

podciąg = „grzbiet”

if $(echo $ciąg | grep -q $podciąg); następnie

echo „Znaleziono $substring w $string”

w przeciwnym razie

echo „$substring nie został znaleziony w $string”

fi

Skrypt używa echodo wysłania ciągu do grep, który szuka podciągu. Używamy opcji -q (cichy), aby przestać grepzapisywać cokolwiek na standardowe wyjście.

Jeżeli wynik wykonania poleceń w nawiasach ” (...)” wynosi zero, oznacza to, że znaleziono dopasowanie. Ponieważ zero pasuje truew Bash, ifinstrukcja jest spełniona i thenklauzula jest wykonywana.

Zobaczmy, jakie są jego wyniki.

./subgrep.sh

Uruchamianie skryptu subgrep.sh

Znajdowanie podciągów za pomocą sed

Możemy również użyć seddo wyszukania podciągu.

Domyślnie seddrukuje cały wprowadzony do niej tekst. Użycie sed -nzapobiega temu. Drukowane są tylko pasujące wiersze. To wyrażenie wyświetli wszystkie wiersze, które pasują lub zawierają wartość $substring.

"/$substring/p"

Przekazujemy wartość $stringdo sedużycia przekierowania tutaj <<<. Służy do przekierowania wartości do polecenia w bieżącej powłoce. Nie wywołuje podpowłoki jak kanał.

Pierwszy -nto test. Zwróci, truejeśli dane wyjściowe sedpolecenia są niezerowe. Jedynym sposobem, w jaki dane wyjściowe sedmogą mieć wartość inną niż null, jest znalezienie pasującego ciągu. Jeśli tak, to $substringnależy go znaleźć w $string.

To jest „subsed.sh”.

#!/bin/bash

string=”Szwecja”

substring=”eden”

if [ -n „$(sed -n „/$podciąg/p”<<< $ciąg)”]; następnie

echo „Znaleziono $substring w $string”

w przeciwnym razie

echo „$substring nie został znaleziony w $string”

fi

Po uruchomieniu skryptu otrzymujemy oczekiwaną odpowiedź.

./subsed.sh

Uruchamianie skryptu subsed.sh

Możemy przetestować logikę skryptu, edytując wartość $substring, aby porównanie się nie powiodło.

./subsed.sh

Uruchamianie skryptu subsed.sh z niedopasowanym podciągiem

Przestań szukać, znalazłeś

Inne narzędzia mogą znaleźć podciągi, takie jak awki , Perlale prosty przypadek użycia, taki jak wyszukiwanie podciągów, nie gwarantuje ich dodatkowej funkcjonalności ani dodatkowej złożoności. W szczególności używanie wbudowanych funkcji Basha do znajdowania podciągów jest szybkie, proste i nie wymaga zewnętrznych narzędzi.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *