J'ai une URL (https://example.com/someone/something) que j'aimerais se décomposer en trois variables:

Je me demande comment je peux faire cela dans Bash en utilisant grep ou awk ou un autre outil.

Pour clarifier, je ne demande pas s'il existe un moyen d'obtenir les trois variables en une seule fois. Il est parfaitement normal d'exécuter trois commandes distinctes pour chaque variable. Quelque chose comme,

URL="https://example.com/someone/something"

DOMAIN=$(echo ${URL} | <some wizardry here>)

USER=$(echo ${URL} | <some wizardry here>)

THING=$(echo ${URL} | <some wizardry here>)
0
jsstrn 16 nov. 2017 à 10:35

5 réponses

Meilleure réponse
#!/bin/bash

URL="https://example.com/someone/something"

DOMAIN=$(echo ${URL} | awk -F'/' '{print $1FS$2FS$3}')    
USER=$(echo ${URL} | awk -F'/' '{print $4}')    
THING=$(echo ${URL} | awk -F'/' '{print $5}')

echo $DOMAIN $USER $THING

Production:

https://example.com someone something
1
tso 16 nov. 2017 à 07:57

Essayez ceci aussi,

URL="https://example.com/someone/something?test=a"

DOMAIN=$(echo "$URL" | python -c "from urlparse import urlparse;import sys; print urlparse(sys.stdin.read()).hostname")

USER=$(echo "$URL" | python -c "from urlparse import urlparse;import sys; print urlparse(sys.stdin.read()).path.split('/')[1]")

THING=$(echo "$URL" | python -c "from urlparse import urlparse;import sys; print urlparse(sys.stdin.read()).path.split('/')[2]")

QUERYSTRING=$(echo "$URL" | python -c "from urlparse import urlparse;import sys; print urlparse(sys.stdin.read()).query")
0
Daein Park 16 nov. 2017 à 08:08

Juste bash :)

URL="https://example.com/someone/something"

regex='(https?://[^/]*)/([^/]*)/(.*)'

if [[ "$URL" =~ $regex ]]
then
  DOMAIN=${BASH_REMATCH[1]}

  UUSER=${BASH_REMATCH[2]}

  THING=${BASH_REMATCH[3]}
fi

echo "$DOMAIN -- $UUSER -- $THING"

J'ai utilisé UUSER pour ne pas être confondu avec la variable d'environnement USER

0
grail 16 nov. 2017 à 08:18

Solution pure bash :

url_str="https://example.com/someone/something"
if [[ "$url_str" =~ ^(http.+)/([^/]+)/([^/]+)$ ]]; then
    domain="${BASH_REMATCH[1]}"
    section1="${BASH_REMATCH[2]}"
    section2="${BASH_REMATCH[3]}"
fi

Résultats:

$ echo $domain 
https://example.com
$ echo $section1
someone
$ echo $section2
something
1
RomanPerekhrest 16 nov. 2017 à 08:18

Essaye ça:

$ URL="https://example.com/someone/something"
$ IFS=' ' read DOMAIN USER THING <<< $(sed 's|/| |3g' <<< ${URL})
$ echo ${DOMAIN}
https://example.com
$ echo ${USER}
someone
$ echo ${THING}
something
1
Weike 16 nov. 2017 à 08:20
47324026