c'è un modo per farlo un passo utilizzando built solo -in base alla funzionalità (nessun programma esterno in esecuzione come sed
) - con BASH_REMATCH
:
url=http://whatever/score/
re='https?://(.*)/score/'
[[ $url =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}"
Corrisponde all'espressione regolare sul lato destro del test =~
e inserisce i gruppi nell'array BASH_REMATCH
.
Ciò premesso, è più convenzionale utilizzare due espressioni di PE e una variabile temporanea:
shopt -s extglob
url=http://whatever/score/
val=${url#http?(s)://}; val=${val%/score/}
printf '%s\n' "$val"
... nell'esempio precedente, l'opzione extglob
viene utilizzata per consentire il guscio di riconosciuto " extglobs "- estensioni di bash alla sintassi glob (creando pattern glob-style simili in potenza alle espressioni regolari), tra cui ?(foo)
significa che foo
è facoltativo.
A proposito, sto usando printf
piuttosto che echo
in questi esempi, perché molti dei comportamenti echo
s' sono definiti dall'implementazione - per esempio, si consideri il caso in cui il contenuto della variabile sono -e
o -n
.
fonte
2013-06-16 01:41:29
Che tipo di modello? Puoi essere un po 'più specifico? –
sì, in questo caso: http: // all'inizio e/punteggio/alla fine. La riga $ viene letta da un file.txt – bobylapointe
Quello che stai cercando è l'espansione dei parametri, in particolare nel tuo caso il '$ {parametro # parola}' e '$ {parametro% parola}' vicino alla fine di [questa sezione di Manuale di Bash] (http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html) – doubleDown