Cum să vă dați seama dacă un șir Bash conține un subșir pe Linux

Publicat: 2022-09-21
Laptop Linux afișează un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Uneori, în scripturile Linux, doriți să știți dacă un șir de text conține un șir specific, mai mic. Există multe moduri de a face acest lucru. Vă prezentăm câteva tehnici simple și de încredere.

De ce este acest lucru util?

Căutarea unui șir pentru un subșir mai mic este o cerință comună. Un exemplu ar fi citirea textului dintr-un fișier sau din inputul uman și căutarea șirului pentru un anumit subșir, astfel încât scriptul dvs. să poată decide ce să facă în continuare. S-ar putea să caute o etichetă sau un nume de dispozitiv într-un fișier de configurare sau un șir de comandă într-o linie de intrare de la un utilizator.

Utilizatorii Linux sunt binecuvântați cu orice număr de utilitare pentru manipularea textului. Unele sunt încorporate în shell-ul Bash, altele sunt furnizate ca utilități sau aplicații independente. Există un motiv pentru care sistemele de operare derivate din Unix sunt bine servite cu capabilități de manipulare a șirurilor.

Cum se manipulează șirurile în Bash pe Linux
LEGATE Cum să manipulați șirurile în Bash pe Linux

Unele lucruri care par a fi fișiere nu sunt fișiere simple. Sunt fișiere speciale care reprezintă lucruri precum dispozitive hardware și surse de informații despre sistem. Abstracția efectuată de sistemul de operare le conferă aspectul și caracteristicile fișierelor. Puteți citi informații de la ei - ca text, desigur - și, în unele cazuri, le puteți scrie, dar nu sunt fișiere obișnuite.

Textul este, de asemenea, folosit ca intrare și ieșire pentru comenzi într-o fereastră de terminal. Acest lucru permite redirecționarea și canalizarea de intrare și de ieșire. Această funcționalitate sprijină capacitatea de a înlănțui secvențe de comenzi Linux împreună, trecând rezultatul de la o comandă ca intrare la următoarea.

Indiferent de originile sale, căutarea în textul pe care îl primim pentru un cuvânt, o comandă, o etichetă semnificativă sau un alt indicator este o parte standard a procesării datelor bazate pe text. Iată o colecție de tehnici simple pe care le puteți include în propriile scripturi.

Găsirea subșirurilor cu elemente integrate Bash

Testul de comparare a șirurilor paranteze duble „ [[...]] ” poate fi folosit în declarațiile if pentru a determina dacă un șir conține un alt șir.

Copiați acest script într-un editor și salvați-l într-un fișier numit „double.sh”.

 #!/bin/bash

dacă [[ "maimuță" = *"cheie"* ]]; apoi
  echo „cheia este în maimuță”
altfel
  echo „cheia nu este în maimuță”
fi 
Cum să utilizați testele condiționate cu paranteze duble în Linux
LEGATE Cum să utilizați testele condiționate cu paranteze duble în Linux

Va trebui să faceți scriptul executabil cu comanda chmod . Acesta este un pas care este întotdeauna necesar pentru a face executabil orice script. Va trebui să faceți acest lucru de fiecare dată când creați un fișier script. Înlocuiți numele scriptului corespunzător în fiecare caz.

 chmod +x dublu.sh 

realizarea unui script executabil cu chmod

Să rulăm scriptul.

 ./double.sh 

Rularea scriptului double.sh

Acest lucru funcționează deoarece asteriscul ” * ” reprezintă orice secvență de caractere, inclusiv niciun caracter. Dacă subșirul „cheie” este situat în șirul țintă, cu sau fără caractere în față sau în spatele acestuia, testul va returna adevărat.

În exemplul nostru, există caractere în fața subșirului. Acestea sunt potrivite de primul asterisc. Nu există litere în spatele subșirului, dar, pentru că un asterisc nu corespunde nici unui caracter, testul trece în continuare.

Pentru flexibilitate, ne putem modifica scriptul pentru a gestiona variabile în loc de șiruri literale. Acesta este scriptul „double2.sh”.

 #!/bin/bash

string="Mamuță"
substring="cheie"

if [[ $șir = *$subșir* ]]; apoi
  echo "$subșirul a fost găsit în $șir"
altfel
  echo "$subșir nu a fost găsit în $șir"
fi

Să vedem cum merge.

 ./double2.sh 

Rularea scriptului double2.sh

Acest lucru funcționează în același mod, cu avantajul că putem folosi nume de variabile în loc de șiruri literale. Transformarea micii noastre soluții într-o funcție va oferi cea mai mare flexibilitate.

Acesta este scriptul „double3.sh”.

 #!/bin/bash

shopt -s nocasematch

string="Mamuță"
substring="Cheie"
capital="Londra"

check_substring ()
{
dacă [[ $1 = *$2* ]]; apoi
  echo „$2 a fost găsit în $1”
altfel
  echo „$2 nu a fost găsit în $1”
fi
}

check_substring „Mamuță” „cheie” 
check_substring $șir $subșir
check_substring $șir „banană”
check_substring „Țara Galilor” $capital

Apelăm funcția noastră check_substring folosind un amestec de variabile și șiruri literale. Am folosit shopt cu opțiunea -s (set) pentru a seta nocasematch , pentru a face potrivirile să nu țină seama de majuscule și minuscule.

Iată cum merge.

 ./double3.sh 

Rularea scriptului double3.sh

Putem folosi trucul de a împacheta subșirul în asteriscuri și în declarațiile case . Acesta este „case.sh.”

 #!/bin/bash

shopt -s nocasematch

string="Wallaby"
substring="Perete"

case $șir în

  *$subșir*)
    echo "$subșirul a fost găsit în $șir"
    ;;

  *)
    echo „Nimic nu se potrivește: $șir”
    ;;
esac

Folosirea declarațiilor case în loc de instrucțiuni if ​​foarte lungi poate face scripturile mai ușor de citit și de depanat. Dacă trebuia să verificați dacă un șir conține unul dintre multele subșiruri posibile, declarația case ar fi cea mai bună alegere.

 ./caz.sh 

Rularea script-ului case.sh

Subșirul este găsit.

Găsirea subșirurilor cu grep

Dincolo de elementele predefinite Bash, primul instrument de căutare a textului la care veți ajunge probabil este grep . Putem folosi capacitatea înnăscută a grep de a căuta un șir într-un șir pentru a căuta subșirurile noastre.

Acest script se numește „subgrep.sh”.

 #!/bin/bash

string="oală de terci"
substring="cresta"

if $(echo $șir | grep -q $subșir); apoi
  echo "$subșirul a fost găsit în $șir"
altfel
  echo "$subșir nu a fost găsit în $șir"
fi

Scriptul folosește echo pentru a trimite șirul în grep , care caută subșirul. Folosim opțiunea -q (liniștită) pentru a opri grep să scrie ceva în ieșirea standard.

Cum să utilizați comanda grep pe Linux
LEGATE Cum să utilizați comanda grep pe Linux

Dacă rezultatul comenzilor din paranteze „ (...) ” este egal cu zero, înseamnă că a fost găsită o potrivire. Deoarece zero este echivalent cu true în Bash, instrucțiunea if este satisfăcută și clauza then este executată.

Să vedem care este rezultatul său.

 ./subgrep.sh 

Rularea scriptului subgrep.sh

Găsirea subșirurilor cu sed

Putem folosi sed și pentru a găsi un subșir.

În mod implicit, sed tipărește tot textul care este introdus în el. Folosirea sed -n previne acest lucru. Singurele linii care sunt imprimate sunt liniile care se potrivesc. Această expresie va tipări orice linii care se potrivesc sau care conțin valoarea $subșirului.

 „/$subșir/p”

Introducem valoarea $string în sed folosind o redirecționare aici, <<< . Acesta este folosit pentru a redirecționa valorile într-o comandă din shell-ul curent. Nu invocă un subshell așa cum ar face-o o țeavă.

Cum să utilizați comanda sed pe Linux
LEGATE Cum să utilizați comanda sed pe Linux

Primul -n este testul. Va returna true dacă rezultatul comenzii sed este diferit de zero. Singurul mod în care ieșirea de la sed poate fi diferită de zero este dacă a fost găsită o linie potrivită. Dacă acesta este cazul, $substring trebuie să fi fost găsit în $string .

Acesta este „subsed.sh.”

 #!/bin/bash

string="Suedia"
substring="eden"

if [ -n "$(sed -n "/$subșir/p" <<< $șir)" ]; apoi
  echo "$subșirul a fost găsit în $șir"
altfel
  echo "$subșir nu a fost găsit în $șir"
fi

Primim răspunsul așteptat atunci când rulăm scriptul.

 ./subsed.sh 

Rularea scriptului subsed.sh

Putem testa logica scriptului prin editarea valorii $substring astfel încât comparația să eșueze.

./subsed.sh

Rularea scriptului subsed.sh cu un subșir nepotrivit

Nu mai căuta, am găsit-o

Alte instrumente pot găsi subșiruri, cum ar fi awk și Perl , dar un caz simplu de utilizare precum găsirea unui subșir nu garantează funcționalitatea suplimentară a acestora și nici complexitatea adăugată. În special, utilizarea integratelor Bash pentru a căuta subșiruri este rapidă, simplă și nu necesită instrumente externe.

LEGATE: Cum să utilizați instrucțiunile de caz în scripturile Bash