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 if
instrukcjach 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ą chmod
polecenia. 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
Uruchommy skrypt.
./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
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_substring
funkcję za pomocą kombinacji zmiennych i łańcuchów literowych. Użyliśmy shopt
z jego -s
opcją (set), aby ustawić nocasematch
, aby dopasowania nie uwzględniały wielkości liter.
Oto jak to działa.
./double3.sh
Możemy również użyć gwiazdek wokół podciągu w case
operatorach. 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 case
instrukcji zamiast bardzo długich if
moż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, case
najlepszym wyborem jest operator.
./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ć grep
wrodzonej 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 echo
do wysłania ciągu do grep
, który szuka podciągu. Używamy opcji -q
(cichy), aby przestać grep
zapisywać cokolwiek na standardowe wyjście.
Jeżeli wynik wykonania poleceń w nawiasach ” (...)
” wynosi zero, oznacza to, że znaleziono dopasowanie. Ponieważ zero pasuje true
w Bash, if
instrukcja jest spełniona i then
klauzula jest wykonywana.
Zobaczmy, jakie są jego wyniki.
./subgrep.sh
Znajdowanie podciągów za pomocą sed
Możemy również użyć sed
do wyszukania podciągu.
Domyślnie sed
drukuje cały wprowadzony do niej tekst. Użycie sed -n
zapobiega 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ść $string
do sed
uż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 -n
to test. Zwróci, true
jeśli dane wyjściowe sed
polecenia są niezerowe. Jedynym sposobem, w jaki dane wyjściowe sed
mogą mieć wartość inną niż null, jest znalezienie pasującego ciągu. Jeśli tak, to $substring
należ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
Możemy przetestować logikę skryptu, edytując wartość $substring
, aby porównanie się nie powiodło.
./subsed.sh
Przestań szukać, znalazłeś
Inne narzędzia mogą znaleźć podciągi, takie jak awk
i , Perl
ale 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