J'ai une chaîne "rtcpOnNbActive true"
stockée dans une variable x
. Je veux extraire "true" en tant que sous-chaîne et stocker dans une variable. Comment puis-je faire ceci?
J'ai une chaîne "rtcpOnNbActive true"
stockée dans une variable x
. Je veux extraire "true" en tant que sous-chaîne et stocker dans une variable. Comment puis-je faire ceci?
Réponses:
Essayez de cette façon:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
afficher la valeur de x
.awk '{print $2}'
imprime le deuxième champ du précédent affiché x
.$(
... )
maintenez la sortie et laissez-la affecter y
.echo $x
n'est pas afficher la valeur dex
. printf '%s\n' "$x"
serait.
awk '{print $2}'
imprime le deuxième champ de chaque ligne du précédent affiché x
.
En supposant qu'il y ait au moins un espace avant la sous-chaîne que vous souhaitez extraire (et que la sous-chaîne ne contient aucun espace), vous pouvez le faire avec une simple expansion de paramètre:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
production
[true]
echo
n'est pas portable pour autre chose qu'une chaîne littérale qui ne commence pas par -
et ne contient aucune séquence d'échappement. Son comportement varie même pour le module intégré bash, selon la façon dont il a été compilé et s'il XPG_ECHO
est défini. En supposant que la chaîne ne contient aucune séquence d'échappement, cela devrait être bien, mais printf '[%s]\n' "$y"
c'est toujours mieux.
echo
pour afficher la valeur des variables, même dans des exemples "jetables" comme celui-ci.
vous pouvez utiliser awk:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
nombre de champs dans l'enregistrement en cours
en utilisant sed:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
en utilisant l'expression de chaîne:
a="rtcpOnNbActive true"
echo ${a##* }
true
en utilisant grep:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o est ne donne que la correspondance exacte, [a-z]+
correspondra à la lettre de az et $
signifie à la fin
echo
n'est pas portable pour autre chose qu'une chaîne littérale qui ne commence pas par -
et ne contient aucune séquence d'échappement. Son comportement varie même pour le module intégré bash, selon la façon dont il a été compilé et s'il XPG_ECHO
est défini. En outre, vous devez toujours doubler les extensions de variable et la substitution de commandes (à certaines exceptions, où ce n'est pas nécessaire mais cela ne fait pas de mal non plus). Avec une chaîne comme les OP, ça devrait aller, mais si vous voulez vous assurer, ce printf '%s\n' "${a##* }"
serait mieux.
Vous pouvez utiliser la fonction read
intégrée
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
? Ce n'est pas read
cela qui fait la scission - c'est le cas $IFS
. Pour une raison quelconque, beaucoup de gens considèrent qu'il est acceptable de diviser w / $IFS
uniquement lorsque cela read
est impliqué. Vous pouvez simplement faire: set -f; IFS=' '; printf %.0s%s $x
ou autre chose. Dans tous les cas, vous devez spécifier $IFS
la valeur de ici.
read
fait le fractionnement en utilisant IFS
, consultez la documentation . Le principal avantage de l'utilisation de read est qu'il définit des variables (ce qui est une exigence OP) et étant donné qu'il peut fractionner des chaînes et remplir un tableau, il est bon pour extraire des champs arbitraires d'une chaîne. De plus, je suppose que la valeur par défaut IFS
ici, mais il est assez facile à définir si nécessaire, IFS=$' \n\t' read -r _ y <<<"$x"
fera l'affaire
read
assigne, $IFS
divise. si vous voulez remplir un tableau, utilisez set
- vous n'avez pas besoin du non-sens artificiel ici-chaîne dans ce cas. unset IFS
obtient le comportement par défaut de $ IFS.
x
juste avant la sous-chaîne que vous souhaitez extraire?