Come sapere se una stringa Bash contiene una sottostringa su Linux

Pubblicato: 2022-09-21
Laptop Linux che mostra un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

A volte negli script Linux, vuoi sapere se una stringa di testo contiene una stringa specifica e più piccola. Ci sono molti modi per farlo. Ti mostriamo alcune tecniche semplici e affidabili.

Perché è utile?

La ricerca di una stringa per una sottostringa più piccola è un requisito comune. Un esempio potrebbe essere la lettura del testo da un file o dall'input umano e la ricerca nella stringa di una sottostringa specifica in modo che lo script possa decidere cosa fare dopo. Potrebbe cercare un'etichetta o un nome di dispositivo in un file di configurazione o una stringa di comando in una riga di input di un utente.

Gli utenti Linux sono benedetti con un numero qualsiasi di utilità per la manipolazione del testo. Alcuni sono integrati nella shell Bash, altri sono forniti come utilità o applicazioni standalone. C'è un motivo per cui i sistemi operativi derivati ​​​​da Unix sono ricchi di capacità di manipolazione delle stringhe.

Come manipolare stringhe in Bash su Linux
CORRELATI Come manipolare stringhe in Bash su Linux

Alcune cose che sembrano essere file non sono semplici file. Sono file speciali che rappresentano cose come dispositivi hardware e fonti di informazioni di sistema. L'astrazione eseguita dal sistema operativo conferisce loro l'aspetto e le caratteristiche dei file. Puoi leggere le informazioni da loro, come testo, naturalmente, e in alcuni casi scriverci, ma non sono file ordinari.

Il testo viene utilizzato anche come input e output per i comandi in una finestra di terminale. Ciò consente il reindirizzamento e la connessione di input e output. Questa funzionalità è alla base della capacità di concatenare sequenze di comandi Linux, passando l'output da un comando come input al successivo.

Indipendentemente dalle sue origini, cercare nel testo che riceviamo una parola significativa, un comando, un'etichetta o qualche altro indicatore è una parte standard della gestione dei dati basati su testo. Ecco una raccolta di semplici tecniche che puoi includere nei tuoi script.

Trovare sottostringhe con Bash Builtins

Il test di confronto di stringhe tra parentesi quadre “ [[...]] ” può essere utilizzato nelle istruzioni if ​​per determinare se una stringa contiene un'altra stringa.

Copia questo script in un editor e salvalo in un file chiamato "double.sh".

 #!/bin/bash

if [[ "scimmia" = *"chiave"* ]]; poi
  echo "la chiave è nella scimmia"
altro
  echo "la chiave non è nella scimmia"
fi 
Come utilizzare i test condizionali a doppia parentesi in Linux
CORRELATI Come utilizzare i test condizionali a doppia parentesi in Linux

Dovrai rendere eseguibile lo script con il comando chmod . Questo è un passaggio sempre necessario per rendere eseguibile qualsiasi script. Dovrai farlo ogni volta che crei un file di script. Sostituire in ogni caso il nome dello script appropriato.

 chmod +x double.sh 

rendere eseguibile uno script con chmod

Eseguiamo lo script.

 ./doppio.sh 

Esecuzione dello script double.sh

Funziona perché l'asterisco " * " rappresenta qualsiasi sequenza di caratteri, inclusi nessun carattere. Se la sottostringa "chiave" si trova all'interno della stringa di destinazione, con o senza caratteri davanti o dietro, il test restituirà true.

Nel nostro esempio, ci sono caratteri davanti alla sottostringa. Questi sono abbinati al primo asterisco. Non ci sono lettere dietro la sottostringa ma, poiché anche un asterisco non corrisponde a nessun carattere, il test viene comunque superato.

Per flessibilità, possiamo modificare il nostro script per gestire le variabili invece delle stringhe letterali. Questo è lo script "double2.sh".

 #!/bin/bash

string="Scimmia"
sottostringa="chiave"

if [[ $stringa = *$sottostringa* ]]; poi
  echo "$sottostringa è stata trovata in $stringa"
altro
  echo "$sottostringa non è stata trovata in $stringa"
fi

Vediamo come funziona.

 ./doppio2.sh 

Esecuzione dello script double2.sh

Funziona allo stesso modo, con il vantaggio che possiamo usare nomi di variabili invece di stringhe letterali. Trasformare la nostra piccola soluzione in una funzione fornirà la massima flessibilità.

Questo è lo script "double3.sh".

 #!/bin/bash

shopt -s nocasematch

string="Scimmia"
sottostringa="Chiave"
capitale="Londra"

check_sottostringa ()
{
se [[$1 = *$2* ]]; poi
  echo "$2 sono stati trovati in $1"
altro
  echo "$2 non è stato trovato in $1"
fi
}

check_substring "Scimmia" "chiave" 
check_sottostringa $stringa $sottostringa
check_substring $stringa "banana"
check_substring "Galles" $capitale

Chiamiamo la nostra funzione check_substring usando un mix di variabili e stringhe letterali. Abbiamo usato shopt con la sua -s (set) opzione per impostare nocasematch , per rendere le corrispondenze senza distinzione tra maiuscole e minuscole.

Ecco come funziona.

 ./doppio3.sh 

Esecuzione dello script double3.sh

Possiamo usare il trucco di racchiudere la sottostringa tra asterischi anche nelle istruzioni case . Questo è "case.sh".

 #!/bin/bash

shopt -s nocasematch

string="Wallaby"
substring="Muro"

caso $stringa dentro

  *$sottostringa*)
    echo "$sottostringa è stata trovata in $stringa"
    ;;

  *)
    echo "Nessuna corrispondenza: $stringa"
    ;;
esac

L'uso di istruzioni case invece di istruzioni if ​​molto lunghe può semplificare la lettura e il debug degli script. Se è necessario verificare se una stringa contiene una delle molte possibili sottostringhe, l'istruzione case sarebbe la scelta migliore.

 ./caso.sh 

Esecuzione dello script case.sh

La sottostringa è stata trovata.

Trovare sottostringhe con grep

Oltre ai builtin di Bash, il primo strumento di ricerca di testo che probabilmente raggiungerai è grep . Possiamo usare la capacità innata di grep di cercare una stringa all'interno di una stringa per cercare le nostre sottostringhe.

Questo script è chiamato "subgrep.sh".

 #!/bin/bash

string="pentola per porridge"
substring="cresta"

if $(echo $stringa | grep -q $sottostringa); poi
  echo "$sottostringa è stata trovata in $stringa"
altro
  echo "$sottostringa non è stata trovata in $stringa"
fi

Lo script usa echo per inviare la stringa in grep , che cerca la sottostringa. Stiamo usando l'opzione -q (quiet) per impedire a grep di scrivere qualsiasi cosa sullo standard output.

Come usare il comando grep su Linux
CORRELATI Come utilizzare il comando grep su Linux

Se il risultato dei comandi tra parentesi " (...) " è uguale a zero, significa che è stata trovata una corrispondenza. Poiché zero equivale a true in Bash, l'istruzione if è soddisfatta e la clausola then viene eseguita.

Vediamo qual è il suo output.

 ./subgrep.sh 

Esecuzione dello script subgrep.sh

Trovare sottostringhe con sed

Possiamo anche usare sed per trovare una sottostringa.

Per impostazione predefinita, sed stampa tutto il testo che viene inserito in esso. L'uso sed -n impedisce ciò. Le uniche righe stampate sono righe corrispondenti. Questa espressione stamperà tutte le righe che corrispondono o contengono il valore di $sottostringa.

 "/$sottostringa/p"

Inseriamo il valore di $string in sed usando un here redirect, <<< . Viene utilizzato per reindirizzare i valori in un comando nella shell corrente. Non invoca una subshell come farebbe una pipe.

Come utilizzare il comando sed su Linux
CORRELATI Come utilizzare il comando sed su Linux

Il primo -n è il test. Restituirà true se l'output del comando sed è diverso da zero. L'unico modo in cui l'output di sed può essere diverso da zero è se è stata trovata una riga corrispondente. In questo caso, $substring deve essere stato trovato in $string .

Questo è "subsed.sh".

 #!/bin/bash

string="Svezia"
sottostringa="eden"

if [ -n "$(sed -n "/$sottostringa/p" <<< $stringa)"]; poi
  echo "$sottostringa è stata trovata in $stringa"
altro
  echo "$sottostringa non è stata trovata in $stringa"
fi

Otteniamo la risposta prevista quando eseguiamo lo script.

 ./subsed.sh 

Esecuzione dello script subsed.sh

Possiamo testare la logica dello script modificando il valore di $substring in modo che il confronto fallisca.

./subsed.sh

Esecuzione dello script subsed.sh con una sottostringa non corrispondente

Smetti di cercare, l'ho trovato

Altri strumenti possono trovare sottostringhe, come awk e Perl , ma un semplice caso d'uso come trovare una sottostringa non garantisce la loro funzionalità aggiuntiva né la complessità aggiunta. In particolare, l'utilizzo dei builtin di Bash per la ricerca di sottostringhe è veloce, semplice e non richiede strumenti esterni.

CORRELATI: Come utilizzare le istruzioni Case negli script Bash