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

Opublikowany: 2022-09-21
Laptop z systemem Linux wyświetlający monit o bash
fatmawati achmad zaenuri/Shutterstock.com

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.

Jak manipulować ciągami znaków w Bash w systemie Linux
POWIĄZANE Jak manipulować ciągami znaków w Bash w systemie Linux

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 
Jak używać testów warunkowych z podwójnym nawiasem w systemie Linux?
POWIĄZANE Jak używać testów warunkowych z podwójnym nawiasem w systemie Linux

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 

tworzenie skryptu wykonywalnego za pomocą chmod

Uruchommy skrypt.

 ./podwójne.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 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 

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

 #!/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 

Uruchamianie skryptu double3.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 

Uruchamianie skryptu case.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.

Jak korzystać z polecenia grep w systemie Linux
POWIĄZANE Jak korzystać z polecenia grep w systemie Linux

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 

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

Jak korzystać z polecenia sed w systemie Linux
POWIĄZANE Jak korzystać z polecenia sed w systemie Linux

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 

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