Cum să vă dați seama dacă un șir Bash conține un subșir pe Linux
Publicat: 2022-09-21Uneori, î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.
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
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
Să rulăm scriptul.
./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
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
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
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.
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
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ă.
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
Putem testa logica scriptului prin editarea valorii $substring
astfel încât comparația să eșueze.
./subsed.sh
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