Pour extraire joebloggs
de cette chaîne dans bash en utilisant l'expansion des paramètres sans aucun processus supplémentaire ...
MYVAR="/var/cpanel/users/joebloggs:DNS9=domain.com"
NAME=${MYVAR%:*} # retain the part before the colon
NAME=${NAME##*/} # retain the part after the last slash
echo $NAME
Cela ne dépend pas d' joebloggs
être à une profondeur particulière du chemin.
Résumé
Un aperçu de quelques modes d'expansion des paramètres, pour référence ...
${MYVAR#pattern} # delete shortest match of pattern from the beginning
${MYVAR##pattern} # delete longest match of pattern from the beginning
${MYVAR%pattern} # delete shortest match of pattern from the end
${MYVAR%%pattern} # delete longest match of pattern from the end
Cela #
signifie donc correspondre depuis le début (pensez à une ligne de commentaire) et %
signifie depuis la fin. Une instance signifie la plus courte et deux instances la plus longue.
Vous pouvez obtenir des sous-chaînes en fonction de la position à l'aide de nombres:
${MYVAR:3} # Remove the first three chars (leaving 4..end)
${MYVAR::3} # Return the first three characters
${MYVAR:3:5} # The next five characters after removing the first 3 (chars 4-9)
Vous pouvez également remplacer des chaînes ou des modèles particuliers en utilisant:
${MYVAR/search/replace}
Le pattern
est dans le même format que la correspondance de nom de fichier, donc *
(tous les caractères) est commun, souvent suivi d'un symbole particulier comme /
ou.
Exemples:
Étant donné une variable comme
MYVAR="users/joebloggs/domain.com"
Supprimez le chemin en laissant le nom du fichier (tous les caractères jusqu'à une barre oblique):
echo ${MYVAR##*/}
domain.com
Supprimez le nom du fichier en laissant le chemin (supprimez la correspondance la plus courte après la dernière /
):
echo ${MYVAR%/*}
users/joebloggs
Obtenez juste l'extension de fichier (supprimez tout avant la dernière période):
echo ${MYVAR##*.}
com
REMARQUE: pour effectuer deux opérations, vous ne pouvez pas les combiner, mais devez les affecter à une variable intermédiaire. Donc, pour obtenir le nom du fichier sans chemin ni extension:
NAME=${MYVAR##*/} # remove part before last slash
echo ${NAME%.*} # from the new var remove the part after the last period
domain
#
place de%
. Si vous ne voulez que la partie après le tout dernier deux-points, utilisez${MYVAR##*:}
pour obtenir la partie après le premier deux-points, utilisez${MYVAR#*:}
${RET##*$CHOP}
ou comme ceci${RET##*CHOP}
(ou d'une autre manière)? EDIT: Semble être l'ancien,${RET##*$CHOP}
Définissez une fonction comme celle-ci:
Et passez la chaîne comme paramètre:
la source
echo $1 | cut -d -f 1 | xargs
. +1 pour des ans simples et soignés.Et pour sed? Cela fonctionnera en une seule commande:
#
sont utilisés pour les diviseurs de regex au lieu de/
puisque la chaîne contient/
..*/
attrape la chaîne jusqu'à la dernière barre oblique inverse.\( .. \)
marque un groupe de capture. C'est ça\([^:]*\)
.[^:]
dit tout caractère _ sauf un deux-points, et le*
signifie zéro ou plus..*
signifie le reste de la ligne.\1
signifie remplacer ce qui a été trouvé dans le premier (et unique) groupe de capture. Tel est le nom.Voici la répartition correspondant à la chaîne avec l'expression régulière:
la source
Utiliser un seul sed
la source
En utilisant un seul Awk:
Autrement dit, en utilisant comme séparateur de champ soit
/
ou:
, le nom d'utilisateur est toujours dans le champ 5.Pour le stocker dans une variable:
Une implémentation plus flexible
sed
qui ne nécessite pas que le nom d'utilisateur soit le champ 5:Autrement dit, supprimez tout ce qui se trouve à partir de
:
et au-delà, puis supprimez tout jusqu'au dernier/
.sed
est probablement plus rapide aussiawk
, donc cette alternative est certainement meilleure.la source