Es gibt einen Weg, ihm einen Schritt zu tun, nur gebaut unter Verwendung von -in Bash-Funktionalität (keine laufenden externen Programme wie sed
) - mit BASH_REMATCH
:
url=http://whatever/score/
re='https?://(.*)/score/'
[[ $url =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}"
Dies stimmt mit dem regulären Ausdruck auf der rechten Seite des =~
-Tests überein und fügt die Gruppen in das Array BASH_REMATCH
ein.
Das heißt, es ist eher konventionellen zwei PE Ausdrücke zu verwenden und eine temporäre Variable:
shopt -s extglob
url=http://whatever/score/
val=${url#http?(s)://}; val=${val%/score/}
printf '%s\n' "$val"
... in dem obigen Beispiel die extglob
Option wird verwendet, die Schale, damit erkannt " extglobs "- die Erweiterungen von bash auf die glob-Syntax (die glob-style-Muster haben eine ähnliche Stärke wie reguläre Ausdrücke), wobei ?(foo)
bedeutet, dass foo
optional ist.
By the way, ich bin mit printf
anstatt echo
in diesen Beispielen, weil viele von echo
‚s Verhalten Implementierung definiert sind - zum Beispiel der Fall betrachtet, in dem der Inhalt der Variable -e
oder -n
sind.
Welche Art von Muster? Kannst du etwas genauer sein? –
Ja, in diesem Fall: http: // am Anfang und/score/am Ende. Die $ -Zeile wird aus einer file.txt gelesen. – bobylapointe
Was Sie suchen, ist die Parametererweiterung, speziell für Ihren Fall die '$ {Parameter # Wort}' und '$ {Parameter% Wort}' am Ende von [dieser Abschnitt von Bash Handbuch] (http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html) – doubleDown