Extrayendo la segunda palabra de una variable de cadena


11

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?


¿Habrá siempre un espacio xjusto antes de la subcadena que desea extraer?
— PM 2Ring

Respuestas:


21

Intenta de esta manera:

y=$(echo $x | awk '{print $2}')
echo $y
  • echo $xmuestra 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.

3
echo $xes no mostrar el valor dex . printf '%s\n' "$x"sería.
— Stéphane Chazelas

2
awk '{print $2}'imprime el segundo campo de cada línea de la mostrada anteriormente x.
— Stéphane Chazelas

9

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]

3
echono 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_ECHOestá configurado. Suponiendo que la cadena no contiene secuencias de escape, esto debería estar bien, pero printf '[%s]\n' "$y"aún es mejor.
— nyuszika7h

1
@ nyuszika7h: Buen punto, y después de haber leído a Stéphane Chazelas decir cosas similares aquí y en otras preguntas recientes, realmente debería romper mi hábito de usar echopara mostrar el valor de las variables, incluso en ejemplos "desechables" como este.
— PM 2Ring

4

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


2
No publique contenido de otra respuesta para la suya en la misma pregunta, por favor.
— αғsнιη

1
¿Qué responden los demás?
— Hackaholic

él puede guardarlo en variable, no es gran cosa aquí
— Hackaholic

echono 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_ECHOestá 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.
— nyuszika7h

3

Es posible usar matrices bash para eso, por ejemplo:

arr="(first second third)"
echo ${arr[1]}

2

Podrías usar el readincorporado

read -r _ y <<<"$x"
printf "%s\n" "$y"
true

¿por qué involucrarse read? No es readeso lo que divide, lo es $IFS. Por alguna razón, mucha gente considera que está bien dividirse $IFS solo cuando readestá involucrado. Simplemente puedes hacer: set -f; IFS=' '; printf %.0s%s $xo lo que sea. En cualquier caso, debe especificar $IFSel valor aquí.
— mikeserv

@mikeserv, está readhaciendo 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 IFSaquí, pero es lo suficientemente fácil de configurar si es necesario, IFS=$' \n\t' read -r _ y <<<"$x"hará el truco
— iruvar

no, no es. readAsignaciones, $IFSdivisiones. si desea llenar una matriz, use set: no necesita el sinsentido artificial de cadena aquí en ese caso. unset IFSobtiene el comportamiento predeterminado de $ IFS.
— mikeserv

@mikeserv, estás fuera de mi lista de tarjetas de Navidad.
— iruvar

bah humbug. Navidad es para tontos.
— mikeserv
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.