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?
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:
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.
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:
¿por qué involucrarse read? No es readeso lo que divide, lo es $IFS. Por alguna razón, mucha gente considera que está bien dividirse $IFSsolo 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.
xjusto antes de la subcadena que desea extraer?Respuestas:
Intenta de esta manera:
echo $xmuestra el valor dex.awk '{print $2}'imprime el segundo campo del que se mostró anteriormentex.$(...)mantenga la salida y permita asignarla ay.fuente
echo $xes 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 anteriormentex.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:
salida
fuente
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 siXPG_ECHOestá configurado. Suponiendo que la cadena no contiene secuencias de escape, esto debería estar bien, peroprintf '[%s]\n' "$y"aún es mejor.echopara mostrar el valor de las variables, incluso en ejemplos "desechables" como este.puedes usar awk:
NFnúmero de campo en el registro actualusando sed:
usando la expresión de cadena:
usando grep:
-o es solo da coincidencia exacta,
[a-z]+coincidirá con la letra de az y$significa al finalfuente
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 siXPG_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 asegurarteprintf '%s\n' "${a##* }"sería mejor.Es posible usar matrices bash para eso, por ejemplo:
fuente
Podrías usar el
readincorporadofuente
read? No esreadeso lo que divide, lo es$IFS. Por alguna razón, mucha gente considera que está bien dividirse$IFSsolo cuandoreadestá involucrado. Simplemente puedes hacer:set -f; IFS=' '; printf %.0s%s $xo lo que sea. En cualquier caso, debe especificar$IFSel valor aquí.readhaciendo la división usandoIFS, 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 predeterminadoIFSaquí, pero es lo suficientemente fácil de configurar si es necesario,IFS=$' \n\t' read -r _ y <<<"$x"hará el trucoreadAsignaciones,$IFSdivisiones. si desea llenar una matriz, useset: no necesita el sinsentido artificial de cadena aquí en ese caso.unset IFSobtiene el comportamiento predeterminado de $ IFS.