Usando regex dentro if clausola in bash


10

Guarda questo se blocco:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0

Questo dovrebbe stampare "abbinato", ma non lo fa. Dove sto sbagliando?

Risposte:


21

Devi rimuovere il preventivo nella corrispondenza regex.

if [[ ${str} =~ m\.m ]]; then

Dalla pagina man di bash:

[...] È disponibile un ulteriore operatore binario, = ~, con la stessa precedenza di == e! =. Quando viene utilizzato, la stringa a destra dell'operatore viene considerata un'espressione regolare estesa e adattata di conseguenza (come in regex (3)). Il valore restituito è 0 se la stringa corrisponde al modello e 1 altrimenti. Se l'espressione regolare è sintatticamente errata, il valore restituito dell'espressione condizionale è 2. Se l'opzione shell nocasematch è abilitata, la corrispondenza viene eseguita indipendentemente dal caso dei caratteri alfabetici. Qualsiasi parte del motivo può essere quotata per forzare la corrispondenza con una stringa.

Quindi, con le virgolette, stai usando una corrispondenza di stringhe molto buona.

Se hai bisogno di spazi nel modello, sfuggili:

str="m   m"
if [[ ${str} =~ m\ +m ]]; then

ma senza virgolette doppie, non possiamo usare il carattere spazio nel modello regex. C'è qualche soluzione per questo?
Majid Azimi,

1
Lo spazio dovrebbe essere evaso come \ .
ДМИТРИЙ МАЛИКОВ,

Se voglio trovare una stringa che termina con un numero dinamico dovrebbe usare ${str} =~ "needle"[0-9]{1}o dovrei usare ${str} =~ needle[0-9]{1}?
mgutt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.