Come verificare se una stringa contiene una sottostringa in Bash

How Check If String Contains Substring Bash



La domanda è come verificare se una stringa contiene una sottostringa in Bash. La risposta è: usa Pattern Matching. Questo fa sorgere un'altra domanda, che è: cos'è il Pattern Matching? Ebbene, una frase in una frase ha determinate caratteristiche. Ecco perché differisce da altre frasi nella stessa frase o in altre frasi. Le caratteristiche possono essere codificate come un modello. In questo modo è possibile identificare una particolare frase in una stringa. In questo articolo viene spiegato come identificare una determinata sottostringa in una stringa più grande, sostituire la sottostringa con un'altra sottostringa e individuare qualsiasi sottostringa in una stringa più grande in base all'indice. Tuttavia, prima di immergersi nelle spiegazioni, è necessario ricordare i diversi modi in cui viene stabilita una stringa in Bash.

Stringa per sfuggire agli spazi

Una stringa può essere costruita sostituendo ogni spazio con la sequenza di escape dello spazio, ''; come in:







myVar=Turismoin L'Egitto è uno del paese 's leader economici industrie.
buttato fuori $myVar

L'uscita è:



Il turismo in Egitto è una delle principali industrie economiche del paese.



Nota: l'apostrofo utilizzava anche la sequenza di escape dello spazio.





Stringa per virgolette singole

Il programmatore ha il tempo di sfuggire a tutti gli spazi in una stringa? No. Pertanto, è meglio usare due virgolette singole per delimitare una stringa; come:

myVar='Il turismo in Egitto è uno dei paesi' ''s principali industrie economiche.'

Una stringa tra virgolette singole non consente l'espansione (sostituzione con il suo effetto) di alcuna sequenza di escape. Fortunatamente, se due stringhe sono codificate una accanto all'altra, verranno considerate come una stringa. Una sequenza di escape può essere inserita nel mezzo, come fatto sopra. La sequenza di fuga verrebbe ampliata. Quindi l'output diventa:



Il turismo in Egitto è una delle principali industrie economiche del paese.

Stringa di virgolette doppie

Con le virgolette, anche le sequenze di escape non vengono espanse, ma le variabili vengono espanse. Il codice seguente lo illustra:

myVar=Turismoin L'Egitto è uno del paese 's leader economici industrie.
buttato fuori $myVar

L'uscita è:

Il turismo in Egitto è una delle principali industrie economiche del paese.

Nota: l'apostrofo utilizzava anche la sequenza di escape dello spazio.

In questo articolo, il tipo principale di stringa considerato è la stringa tra virgolette singole.

Nozioni di base sulle espressioni regolari

Regex

Considera questa stringa:

Questo mondo non è davvero casa nostra.

Lascia che il mondo sia la sottostringa di interesse. Quindi, la stringa grande (stringa intera) viene chiamata stringa di destinazione o semplicemente target. Il 'mondo' tra virgolette è chiamato espressione regolare o semplicemente regex. Il contenuto, il mondo, è lo schema, in questo caso.

Abbinamento semplice

Nel codice seguente, se la parola 'mondo' viene trovata nell'obiettivo, diremmo che la parola è stata abbinata.

P='Questo mondo non è realmente la nostra casa.'
reg='mondo'
Se [[ $ str= ~$reg ]];poi
buttato fuoritrovato
altro
buttato fuorinon trovato
essere

=~ , che è l'operatore di assegnazione seguito da ~ , è chiamato operatore di associazione. La condizione controlla se il modello trova corrispondenza nella stringa di destinazione. Se nella destinazione viene trovata una sottostringa corrispondente al modello, l'istruzione echo visualizza found. Se non viene trovata, l'istruzione echo non viene trovata. L'output di questo codice è:

trovato

Poiché lo schema, il mondo, si trova nel bersaglio. Notare che lo spazio di delimitazione dopo [[ e prima ]] è stato mantenuto.

Modello

Nel codice sopra, 'mondo' tra virgolette è l'espressione regolare mentre il mondo stesso è il modello. Questo è un modello semplice. Tuttavia, la maggior parte dei modelli non è così semplice. Un pattern è una caratterizzazione di una sottostringa da trovare. E così, il pattern Bash utilizza alcuni metacaratteri. Un metacarattere è un personaggio relativo ad altri personaggi. Ad esempio, Bash Pattern utilizza i seguenti metacaratteri:

^ $ . * +? () [] {} |

Un'espressione regolare può anche essere digitata nelle doppie parentesi quadre di condizione. Ma non deve essere tra virgolette. Quindi, in questo caso, è letteralmente uno schema.

Classi di personaggi

Parentesi quadre

Viene trovato l'output del seguente codice, il che significa che si è verificata una corrispondenza:

P='Il gatto è entrato nella camera.'
Se [[ $ str= ~[cbr]a]];poi
buttato fuoritrovato
essere

Lo schema, [cbr]at ha abbinato cat, che inizia con 'c' e che continua e termina con at. [cbr]at significa, corrisponde a 'c' o 'b' o 'r' seguito da at.

Viene trovato l'output del seguente codice, il che significa che si è verificata una corrispondenza:

P='Il pipistrello è entrato nella camera.'
Se [[ $ str= ~[cbr]a]];poi
buttato fuoritrovato
essere

Lo schema, [cbr]at ha abbinato pipistrello, che inizia con 'b' e che continua e termina con at. [cbr]at significa, corrisponde a 'c' o 'b' o 'r' seguito da at.

Viene trovato l'output del seguente codice, il che significa che si è verificata una corrispondenza:

P='Il topo è entrato nella camera.'
Se [[ $ str= ~[cbr]a]];poi
buttato fuoritrovato
essere

Il modello, [cbr]at ha abbinato rat, che inizia con 'r' e che continua e termina con at.

Negli esempi di codice sopra, il programmatore non sa se gatto o pipistrello o ratto esistono nella stringa di destinazione. Ma sa che la sottostringa inizia con 'c' o 'b' o 'r', quindi continua e termina con at. Le parentesi quadre in uno schema consentono a diversi caratteri possibili di far corrispondere un carattere in una posizione rispetto ad altri nella destinazione. Quindi, le parentesi quadre contengono un insieme di caratteri, di cui uno corrisponde a una sottostringa. Infine, è la sottostringa completa che viene trovata.

Gamma di caratteri

Nel codice sopra [cbr] è una classe. Anche se 'c' o 'b' o 'r' corrispondono a un singolo carattere, se a quello che segue immediatamente non corrisponde, il modello non corrisponderà a nulla.

Bene, ci sono alcuni intervalli che formeranno una classe. Ad esempio, da 0 a 9 cifre formano la classe, [0-9] con 0 e 9 inclusi. Le lettere minuscole da 'a' a 'z' formano la classe [a-z] con 'a' e 'z' inclusi. Le maiuscole da 'A' a 'Z' formano la classe [A-Z] con 'A' e 'Z' incluse. Da una classe, è uno dei caratteri che corrisponderebbe a un carattere nella stringa.

Il codice seguente produce una corrispondenza:

Se [[ 'ID8id'= ~[0-9] ]];poi
buttato fuoritrovato
essere

Questa volta l'obiettivo è una stringa letterale nella condizione. 8, che è uno dei possibili numeri all'interno dell'intervallo, [0-9], ha trovato una corrispondenza con 8 nella stringa 'ID8id'. Il codice sopra è equivalente a:

Se [[ 'ID8id'= ~[0123456789] ]];poi
buttato fuoritrovato
essere

Qui, tutti i possibili numeri sono stati scritti nello schema, quindi non c'è il trattino.

Nel codice seguente si ottiene una corrispondenza:

Se [[ 'ID8iD'= ~[a-z] ]];poi
buttato fuoritrovato
essere

La corrispondenza è tra la 'i' minuscola dell'intervallo, [a-z], e la 'i' minuscola della stringa di destinazione, 'ID8iD'.

Ricorda: la gamma è una classe. La classe può far parte di un modello più ampio. Quindi, in uno schema, il testo può essere davanti e/o dopo la classe. Il codice seguente lo illustra:

Se [[ 'ID8id è l'identificatore'=~ ID[0-9]ID ]];poi
buttato fuoritrovato
essere

L'output è: trovato. 'ID8id' dal pattern ha trovato 'ID8id' nella stringa di destinazione.

Negazione

La corrispondenza non si ottiene dal seguente codice:

Se [[ '0123456789101112'= ~[^0-9] ]];poi
buttato fuoritrovato
altro
buttato fuorinon trovato
essere

L'uscita è:

non trovato

Senza ^ davanti all'intervallo, all'interno delle parentesi quadre, lo zero dell'intervallo corrisponderebbe al primo zero della stringa di destinazione. Quindi, ^ davanti a un intervallo (o caratteri facoltativi) nega la classe.

Il codice seguente produce una corrispondenza perché la condizione recita: corrisponde a qualsiasi carattere non numerico in qualsiasi punto della destinazione:

Se [[ 'ABCDEFGHHIJ'= ~[^0-9] ]];poi
buttato fuoritrovato
altro
buttato fuorinon trovato
essere

Quindi l'output è: found .

[^0-9] significa una non cifra, quindi [^0-9] è la negazione di [0-9] .

[^a-z] significa una lettera non minuscola, quindi [^a-z] è la negazione di [a-z] .

[^A-Z] significa una lettera non maiuscola, quindi [^A-Z] è la negazione di [A-Z] .

Altre negazioni sono disponibili.

Il punto (.) nel modello

Il punto (.) nel modello corrisponde a qualsiasi carattere compreso se stesso. Considera il seguente codice:

Se [[ '6759WXY.A3'= ~ 7,9 W.Y.A]];poi
buttato fuoritrovato
essere

L'output del codice viene trovato perché gli altri caratteri corrispondono. Un punto corrisponde a '5'; un altro punto corrisponde a 'X'; e l'ultimo punto corrisponde a un punto.

Alternanza di corrispondenza

Considera questa frase per una stringa di destinazione:

La gabbia ha uccelli di diversi tipi.

Qualcuno potrebbe voler sapere se questo bersaglio ha un piccione, un pavone o un'aquila. È possibile utilizzare il seguente codice:

P='La gabbia ha pavoni di diversi tipi.'
Se [[ $ str=~ piccione|pavone|Aquila]];poi
buttato fuoritrovato
altro
buttato fuorinon trovato
essere

L'output è, trovato. Il metacarattere alternato, | è stato impiegato. Ci possono essere due, tre, quattro e più alternative. Ciò che corrisponde a questo codice è 'pavone'.

Raggruppamento

Nel modello seguente, le parentesi sono state utilizzate per raggruppare i caratteri:

un palcoscenico (ballerino)

Il gruppo qui è un ballerino di scena circondato dai metacaratteri (e). (ballerino) è un sottogruppo, mentre un palcoscenico (ballerino) è l'intero gruppo. Considera quanto segue:

Il (ballerino è fantastico)

Qui, il sottogruppo o sottostringa è, il ballerino è fantastico.

Sottostringhe con parti comuni

Uno stakeholder è una persona con un interesse in un'impresa. Immagina un'azienda con un sito web, stake.com. Immagina che una delle seguenti stringhe di destinazione sia nel computer:

Il sito web, stake.com è per il business.;

C'è lo stakeholder.;

Lo stakeholder lavora per stake.com.;

Lascia che una di queste stringhe sia il bersaglio. Il programmatore potrebbe voler sapere se stake.com o lo stakeholder si trovano in una qualsiasi stringa di destinazione. Il suo modello sarebbe:

stake.com|stakeholder

usando l'alternanza.

palo è stato digitato due volte nelle due parole. Questo può essere evitato digitando il modello come segue:

puntata(.com|titolare)

.com|holder è il sottogruppo in questo caso.

Nota: l'uso del carattere alternato in questo caso. La ricerca su stake.com o stakeholder verrà comunque eseguita. Si trova l'output del seguente codice:

P='Il sito web, stake.com è per il business.'
Se [[ $ str=~ puntata(.insieme a|titolare) ]];poi
buttato fuoritrovato
essere

La sottostringa abbinata qui è stake.com.

L'array predefinito BASH_REMATCH

BASH_REMATCH è un array predefinito. Supponiamo che un modello abbia gruppi. L'intero gruppo abbinato va nella cella per l'indice 0 di questo array. Il primo sottogruppo abbinato va nella cella per l'indice 1; il secondo sottogruppo corrispondente, va nella cella per l'indice 2 e così via. Il codice seguente mostra come utilizzare questo array:

P='Il ballerino è arrivato.'
Se [[ $ str=~ stadio(ballerino) ]];poi
buttato fuoritrovato
essere

perioin ${!BASH_REMATCH[@]};fare
printf '${BASH_REMATCH[i]}, '
fatto
buttato fuori

L'uscita è:

trovato
ballerino di scena, ballerino,

L'intero gruppo è ballerino di scena. C'è solo un sottogruppo, che è ballerino.

Nota: lo spazio nel modello è stato sfuggito.

Corrispondenza indipendenza maiuscole/minuscole

La corrispondenza, come spiegato sopra, fa distinzione tra maiuscole e minuscole. L'abbinamento può essere effettuato indipendentemente dal caso. Ciò è illustrato nel codice seguente:

negozi -Snocasematch

P='Ci piace la buona musica.'
Se [[ $ str=~ Buono]];poi
buttato fuoritrovato
essere

negozi -unocasematch

L'output è: trovato. Il modello è, buono. La sottostringa corrispondente è 'buona'. Nota come l'opzione nocasematch è stata abilitata all'inizio del code segment e disabilitata alla fine del code segment.

Lunghezza di una stringa

La sintassi per ottenere la lunghezza di una stringa è:

${#PARAMETER}

Esempio:

P='Ci piace la buona musica.'
buttato fuori $ {# str}

L'uscita è: 19.

Riduzione delle corde

Le sintassi per la riduzione delle stringhe sono:

${PARAMETER:OFFSET}
${PARAMETER:OFFSET:LENGTH}

dove il conteggio per OFFSET inizia da zero.

L'esempio seguente mostra come rimuovere i primi 11 caratteri di una stringa:

P='Ballo sempre con della buona musica.'
buttato fuori $ {str: 10}

L'uscita è:

ance alla buona musica.

Il conteggio per LUNGHEZZA inizia dal carattere successivo. Il codice seguente mostra come può essere consentita una parte all'interno della stringa:

P='Ballo sempre con della buona musica.'
buttato fuori $ {str: 10: 6}

L'uscita è:

ance t

I primi 11 caratteri sono stati rimossi; i successivi 6 caratteri sono stati consentiti e il resto dei caratteri è stato rimosso automaticamente.

Cerca e sostituisci

Quando viene trovata una sottostringa, può essere sostituita con un'altra sottostringa. Le sintassi per questo sono:

dove=${PARAMETRO/SCHEMA/SOSTITUZIONE}
dove=${PARAMETRO//MODELLO/SOSTITUZIONE}
dove=${PARAMETRO/SCHEMA}
dove=${PARAMETRO//SCHEMA}

Per la prima sintassi con una singola barra, viene sostituita solo la prima corrispondenza. Esempio:

P='C'è un topo, un pipistrello e un gatto, nella camera.'
Giusto=${str/[cbr]at/grande mucca}
buttato fuori $ str
buttato fuori $ ret

L'uscita è:

C'è un topo, un pipistrello e un gatto, nella camera.
C'è una grande mucca, un pipistrello e un gatto, nella camera.

Per la seconda sintassi con doppie barre, tutte le occorrenze della corrispondenza vengono sostituite. Esempio:

P='C'è un topo, un pipistrello e un gatto, nella camera.'
Giusto=${str//[cbr]at/grande mucca}
buttato fuori $ str
buttato fuori $ ret

L'uscita è:

C'è un topo, un pipistrello e un gatto, nella camera.
C'è una grande mucca, una grande mucca e una grande mucca, nella camera.

Per la terza sintassi con una singola barra, non c'è sostituzione per la prima e unica corrispondenza.

Inoltre, la prima sottostringa trovata viene eliminata. Esempio:

P='C'è un topo, un pipistrello e un gatto, nella camera.'
Giusto=${str/[cbr]at}
buttato fuori $ str
buttato fuori $ ret

Per la quarta sintassi con doppie barre, non c'è sostituzione per tutte le corrispondenze. Inoltre, tutte le sottostringhe trovate vengono eliminate. Esempio:

P='C'è un topo, un pipistrello e un gatto, nella camera.'
Giusto=${str//[cbr]at}
buttato fuori $ str
buttato fuori $ ret

L'uscita è:

C'è un topo, un pipistrello e un gatto, nella camera.
C'è una , una e una , nella camera.

Conclusione

Per verificare se una stringa ha una sottostringa in Bash, è necessario utilizzare Pattern Matching. Il Pattern Matching non avviene solo nelle doppie parentesi quadre di condizione, [[ . . . ]]. Può anche avvenire nell'espansione dei parametri, con il suo ${. . .}. Con l'espansione dei parametri è possibile ottenere una sottostringa per indici.

Ciò che è stato presentato in questo articolo sono i punti più critici nel Pattern Matching. Ci sono più! Tuttavia, ciò che il lettore dovrebbe studiare in seguito, è l'espansione del nome del file.