Jak sprawdzić, czy ciąg Bash zawiera podciąg w systemie Linux?
Opublikowany: 2022-09-21Czasami 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