istnieje sposób, aby zrobić jeden krok używając tylko zbudowany -w funkcji bash (brak uruchomionych programów zewnętrznych, takich jak sed
) - z BASH_REMATCH
:
url=http://whatever/score/
re='https?://(.*)/score/'
[[ $url =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}"
Dopasowuje się do wyrażenia regularnego po prawej stronie testu =~
i umieszcza grupy w tablicy BASH_REMATCH
.
Powiedział, że jest to bardziej konwencjonalne użycie dwóch wyrażeń PE i tymczasową zmienną:
shopt -s extglob
url=http://whatever/score/
val=${url#http?(s)://}; val=${val%/score/}
printf '%s\n' "$val"
... W powyższym przykładzie, opcja extglob
służy do umożliwienia powłoka uznane " extglobs "- rozszerzenia bash do składni globu (tworzenie wzorców w stylu globalnym podobnych do potęgi do wyrażeń regularnych), wśród których ?(foo)
oznacza, że foo
jest opcjonalne.
Nawiasem mówiąc, używam printf
zamiast echo
w tych przykładach, ponieważ wiele z zachowań echo
„s są zdefiniowane realizacja - na przykład, rozważmy przypadek, w którym zawartość zmiennej są -e
lub -n
.
Jaki wzór? Czy możesz być trochę bardziej konkretny? –
tak, w tym przypadku: http: // na początku i/score/na końcu. Linia $ jest odczytywana z pliku.txt – bobylapointe
To, czego szukasz, to rozszerzenie parametrów, w szczególności do twojego przypadku: '$ {słowo_parametru}' i '$ {parametr% słowo}' pod koniec [tej sekcji Bash manual] (http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html) – doubleDown