Tengo una cadena "rtcpOnNbActive true"
almacenada en una variable x
. Quiero extraer "true" como subcadena y almacenar en una variable. ¿Cómo puedo hacer esto?
Tengo una cadena "rtcpOnNbActive true"
almacenada en una variable x
. Quiero extraer "true" como subcadena y almacenar en una variable. ¿Cómo puedo hacer esto?
Respuestas:
Intenta de esta manera:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
muestra el valor de x
.awk '{print $2}'
imprime el segundo campo del que se mostró anteriormente x
.$(
... )
mantenga la salida y permita asignarla a y
.echo $x
es no mostrar el valor dex
. printf '%s\n' "$x"
sería.
awk '{print $2}'
imprime el segundo campo de cada línea de la mostrada anteriormente x
.
Suponiendo que hay al menos un espacio antes de la subcadena que desea extraer (y que la subcadena no contiene espacios), puede hacerlo con una simple expansión de parámetros:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
salida
[true]
echo
no es portátil para otra cosa que no sea una cadena literal que no comienza -
y no contiene ninguna secuencia de escape. Su comportamiento varía incluso para el bash incorporado, dependiendo de cómo se compiló y si XPG_ECHO
está configurado. Suponiendo que la cadena no contiene secuencias de escape, esto debería estar bien, pero printf '[%s]\n' "$y"
aún es mejor.
echo
para mostrar el valor de las variables, incluso en ejemplos "desechables" como este.
puedes usar awk:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
número de campo en el registro actual
usando sed:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
usando la expresión de cadena:
a="rtcpOnNbActive true"
echo ${a##* }
true
usando grep:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o es solo da coincidencia exacta, [a-z]+
coincidirá con la letra de az y $
significa al final
echo
no es portátil para otra cosa que no sea una cadena literal que no comienza -
y no contiene ninguna secuencia de escape. Su comportamiento varía incluso para el bash incorporado, dependiendo de cómo se compiló y si XPG_ECHO
está configurado. Además, siempre debe duplicar las expansiones de variables entre comillas y la sustitución de comandos (con ciertas excepciones, donde no es necesario pero tampoco hace daño). Con una cadena como los OP, esto debería estar bien, pero si quieres asegurarte printf '%s\n' "${a##* }"
sería mejor.
Podrías usar el read
incorporado
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
? No es read
eso lo que divide, lo es $IFS
. Por alguna razón, mucha gente considera que está bien dividirse $IFS
solo cuando read
está involucrado. Simplemente puedes hacer: set -f; IFS=' '; printf %.0s%s $x
o lo que sea. En cualquier caso, debe especificar $IFS
el valor aquí.
read
haciendo la división usando IFS
, revisa la documentación . La principal ventaja de usar read es que establece variables (que es un requisito de OP) y dado que puede dividir cadenas y llenar una matriz, es bueno para extraer campos arbitrarios de una cadena. Además, estoy asumiendo el valor predeterminado IFS
aquí, pero es lo suficientemente fácil de configurar si es necesario, IFS=$' \n\t' read -r _ y <<<"$x"
hará el truco
read
Asignaciones, $IFS
divisiones. si desea llenar una matriz, use set
: no necesita el sinsentido artificial de cadena aquí en ese caso. unset IFS
obtiene el comportamiento predeterminado de $ IFS.
x
justo antes de la subcadena que desea extraer?