Jak sprawdzić, czy ciąg Bash zawiera podciąg w systemie Linux?
Opublikowany: 2022-09-21
Czasami w skryptach Linuksa chcesz wiedzieć, czy ciąg tekstu zawiera określony, mniejszy ciąg. Istnieje wiele sposobów, aby to zrobić. Pokażemy Ci kilka prostych, niezawodnych technik.
Dlaczego jest to przydatne?
Wyszukiwanie ciągu w celu znalezienia mniejszego podciągu jest powszechnym wymaganiem. Jednym z przykładów może być odczytywanie tekstu z pliku lub danych wejściowych człowieka i wyszukiwanie w ciągu określonego podciągu, aby skrypt mógł zdecydować, co dalej. Może szukać etykiety lub nazwy urządzenia w pliku konfiguracyjnym lub ciągu poleceń w wierszu danych wejściowych od użytkownika.
Użytkownicy Linuksa są pobłogosławieni dowolną liczbą narzędzi do manipulowania tekstem. Niektóre są wbudowane w powłokę Bash, inne są dostarczane jako samodzielne 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, nie są prostymi plikami. Są to specjalne pliki reprezentujące takie rzeczy, 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żesz czytać z nich 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. Pozwala to na przekierowanie i orurowanie wejścia i wyjścia. Ta funkcjonalność wspiera zdolność łączenia sekwencji poleceń Linuksa razem, przekazując dane wyjściowe jednego polecenia jako dane wejściowe do następnego.
Bez względu na jego pochodzenie, wyszukiwanie w otrzymanym tekście znaczącego słowa, polecenia, etykiety lub jakiegoś innego wskaźnika jest standardową częścią postępowania z danymi tekstowymi. Oto zbiór prostych technik, które możesz uwzględnić we własnych skryptach.
Znajdowanie podciągów za pomocą wbudowanych Bash
Test porównywania ciągów podwójnych nawiasów „ [[...]] ” może być użyty w instrukcjach if w celu określenia, czy jeden ciąg zawiera inny ciąg.
Skopiuj ten skrypt do edytora i zapisz go w pliku o nazwie „double.sh”.
#!/kosz/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ą polecenia chmod . Jest to krok, który jest zawsze wymagany, aby każdy skrypt był wykonywalny. Musisz to zrobić za każdym razem, gdy tworzysz plik skryptu. W każdym przypadku zastąp nazwę odpowiedniego skryptu.
chmod +x double.sh

Uruchommy skrypt.
./podwójne.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 za nim, test zwróci prawdę.
W naszym przykładzie przed podciągiem znajdują się znaki. Są one dopasowane przez pierwszą gwiazdkę. Za podciągiem nie ma żadnych liter, ale ponieważ gwiazdka również nie pasuje do żadnych znaków, test nadal przechodzi pomyślnie.
Aby zapewnić elastyczność, możemy zmodyfikować nasz skrypt, aby obsługiwał zmienne zamiast ciągów literowych. To jest skrypt „double2.sh”.
#!/kosz/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.
./podwójne2.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”.
#!/kosz/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 "Walia" $capital Wywołujemy naszą funkcję check_substring używając kombinacji zmiennych i łańcuchów literału. Użyliśmy shopt z opcją -s (set), aby ustawić nocasematch , aby w dopasowaniach nie było rozróżniania wielkości liter.

Oto jak to działa.
./podwójne3.sh

W instrukcjach case możemy również zastosować sztuczkę polegającą na zawijaniu podciągu w gwiazdki. To jest „case.sh”.
#!/kosz/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 instrukcji case zamiast bardzo długich instrukcji if może ułatwić czytanie i debugowanie skryptów. Jeśli musisz sprawdzić, czy łańcuch zawiera jeden z wielu możliwych podłańcuchów, najlepszym wyborem będzie instrukcja case .
./przypadek.sh

Znaleziono podciąg.
Znajdowanie podciągów za pomocą grep
Poza wbudowanymi elementami Bash, pierwszym narzędziem do wyszukiwania tekstu, do którego prawdopodobnie sięgniesz, jest grep . Możemy użyć wrodzonej zdolności grep do wyszukiwania ciągu w ciągu, aby wyszukać nasze podciągi.
Ten skrypt nazywa się „subgrep.sh”.
#!/kosz/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 echo do wysłania ciągu do grep , który wyszukuje podciąg. Używamy opcji -q (cichy), aby zatrzymać wypisywanie czegokolwiek przez grep na standardowe wyjście.
Jeśli wynik poleceń w nawiasach „ (...) ” jest równy zero, oznacza to, że znaleziono dopasowanie. Ponieważ zero równa się true w Bash, instrukcja if jest spełniona i wykonywana jest klauzula then .
Zobaczmy, jakie jest jego wyjście.
./subgrep.sh

Znajdowanie podciągów za pomocą sed
Możemy również użyć sed do znalezienia podciągu.
Domyślnie sed wypisuje cały wprowadzony do niego tekst. Użycie sed -n zapobiega temu. Jedyne drukowane wiersze to pasujące wiersze. To wyrażenie wyświetli wszystkie wiersze, które pasują lub zawierają wartość $substring.
"/$podciąg/p"
Wprowadzamy wartość $string do sed za pomocą przekierowania tutaj, <<< . Służy do przekierowania wartości do polecenia w bieżącej powłoce. Nie wywołuje podpowłoki w sposób, w jaki zrobiłby to potok.
Pierwsze -n to test. Zwróci true , jeśli dane wyjściowe polecenia sed są niezerowe. Jedynym sposobem, w jaki wyjście z sed może być niezerowe, jest znalezienie pasującej linii. Jeśli tak jest, $substring musiał zostać znaleziony w $string .
To jest „subsed.sh”.
#!/kosz/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

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

Przestań szukać, znalazłeś to
Inne narzędzia mogą znajdować podciągi, takie jak awk i Perl , ale prosty przypadek użycia, taki jak znajdowanie podłańcucha, nie gwarantuje ich dodatkowej funkcjonalności ani dodatkowej złożoności. W szczególności użycie wbudowanych Bash do wyszukiwania podciągów jest szybkie, proste i nie wymaga zewnętrznych narzędzi.
POWIĄZANE: Jak używać instrukcji przypadku w skryptach Bash


