2016-05-31 3 views
0

я принципиально хочу, чтобы извлечь части из URL-адрес в различные переменные окружения для последующего использования, поэтому я ожидал, чтобы быть в состоянии сделать что-то вроде этого:Как извлечь несколько переменных среды из регулярного выражения в Bash?

echo "my-app.domain.com:8080" | \ 
sed -r 's/((\w+)\.)?(\w+\.\w+)(\:(\d+))?/\2\n\3\n\5/g' | \ 
read SUBDOMAIN DOMAIN PORT 

Однако это не похоже на работу (и какой-то причине «:» от порта всегда выводится в «\ 5»):

sh-4.2# echo "my-app.domain.com:8080" | \ 
sed -r 's/((\w+)\.)?(\w+\.\w+)(\:(\d+))?/\2\n\3\n\5/g' 
my-app 
domain.com 
:8080 

что более странно для меня является то, что если я печатаю новую строку после \ 5, то это будет выходной :

sh-4.2# echo "my-app.domain.com:8080" | sed -r 's/((\w+)\.)?(\w+\.\w+)(\:(\d+))?/\2\n\3\n\5\n/g' 
my-app 
domain.com 

:8080 

В любом случае, при использовании read, ни одна из переменных не установлена ​​... кажется, я делаю несколько ошибок, но не могу точно определить, что именно.

ответ

3

С GNU Баш:

url="my-app.domain.com:8080" 
[[ $url =~ ([^.]*)\.(.*):(.*) ]] 
subdomain="${BASH_REMATCH[1]}" 
domain="${BASH_REMATCH[2]}" 
port="${BASH_REMATCH[3]}" 
echo "$subdomain $domain $port" 

Выход:

 
my-app domain.com 8080 

См: The Stack Overflow Regular Expressions FAQ

+0

Это ... прекрасный – dukeofgaming

0

Это дубликат, см Bash script, read values from stdin pipe В частности, Баш встроенные «shopt -s lastpipe» приведет к выполнению команды «читать» ed внутри этой оболочки вместо подоболочки.

Смежные вопросы