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?
echo $xn'est pas afficher la valeur dex . printf '%s\n' "$x"serait.
Stéphane Chazelas
2
awk '{print $2}'imprime le deuxième champ de chaque ligne du précédent affiché x.
Stéphane Chazelas
9
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:
echon'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_ECHOest 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.
nyuszika7h
1
@ nyuszika7h: Bon point, et après avoir lu Stéphane Chazelas dire des choses similaires ici et dans d'autres questions récentes, je dois vraiment rompre avec mon habitude d'utiliser echopour afficher la valeur des variables, même dans des exemples "jetables" comme celui-ci.
Ne postez pas le contenu d'une autre réponse pour la vôtre dans la même question, s'il vous plaît.
αғsнιη
1
ce que les autres répondent ????
Hackaholic
il peut l'enregistrer en variable ce n'est pas un gros problème ici
Hackaholic
echon'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_ECHOest 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.
nyuszika7h
3
Il est possible d'utiliser des tableaux bash pour cela, par exemple:
pourquoi impliquer read? Ce n'est pas readcela 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 / $IFSuniquement lorsque cela readest impliqué. Vous pouvez simplement faire: set -f; IFS=' '; printf %.0s%s $xou autre chose. Dans tous les cas, vous devez spécifier $IFSla valeur de ici.
mikeserv
@mikeserv, il readfait 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 IFSici, mais il est assez facile à définir si nécessaire, IFS=$' \n\t' read -r _ y <<<"$x"fera l'affaire
iruvar
non ce n'est pas. readassigne, $IFSdivise. si vous voulez remplir un tableau, utilisez set- vous n'avez pas besoin du non-sens artificiel ici-chaîne dans ce cas. unset IFSobtient le comportement par défaut de $ IFS.
mikeserv
@mikeserv, vous êtes hors de ma liste de cartes de Noël.
x
juste avant la sous-chaîne que vous souhaitez extraire?Réponses:
Essayez de cette façon:
echo $x
afficher la valeur dex
.awk '{print $2}'
imprime le deuxième champ du précédent affichéx
.$(
...)
maintenez la sortie et laissez-la affectery
.la source
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:
production
la source
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'ilXPG_ECHO
est défini. En supposant que la chaîne ne contient aucune séquence d'échappement, cela devrait être bien, maisprintf '[%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:
NF
nombre de champs dans l'enregistrement en coursen utilisant sed:
en utilisant l'expression de chaîne:
en utilisant grep:
-o est ne donne que la correspondance exacte,
[a-z]+
correspondra à la lettre de az et$
signifie à la finla source
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'ilXPG_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, ceprintf '%s\n' "${a##* }"
serait mieux.Il est possible d'utiliser des tableaux bash pour cela, par exemple:
la source
Vous pouvez utiliser la fonction
read
intégréela source
read
? Ce n'est pasread
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 celaread
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 utilisantIFS
, 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éfautIFS
ici, mais il est assez facile à définir si nécessaire,IFS=$' \n\t' read -r _ y <<<"$x"
fera l'affaireread
assigne,$IFS
divise. si vous voulez remplir un tableau, utilisezset
- 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.