¿Qué comando linux shell devuelve una parte de una cadena? [duplicar]
Pregunta
Esta pregunta ya tiene una respuesta aquí:
- Extraer la subcadena en Bash 20 respuestas
Quiero encontrar un comando de Linux que pueda devolver una parte de la cadena. En la mayoría de los lenguajes de programación, es la función substr ()
. ¿Bash tiene algún comando que pueda usarse para este propósito? Quiero poder hacer algo como esto ...
substr " abcdefg " 2 3
- imprime cde
.
Pregunta similar posterior:
Solución
Si está buscando una utilidad de shell para hacer algo así, puede usar el comando cortar
.
Para tomar su ejemplo, intente:
echo "abcdefg" | cut -c3-5
que rinde
cde
Donde -cN-M
le dice al comando cut que devuelva las columnas N
a M
, inclusive.
Otros consejos
Desde la página de manual de bash:
${parameter:offset}
${parameter:offset:length}
Substring Expansion. Expands to up to length characters of
parameter starting at the character specified by offset.
[...]
O, si no está seguro de tener bash
, considere usar cortar
.
En " puro " bash tiene muchas herramientas para la manipulación de (sub) cadenas, principalmente, pero no exclusivamente en expansión de parámetros :
${parameter//substring/replacement}
${parameter##remove_matching_prefix}
${parameter%%remove_matching_suffix}
Expansión de subcadenas indexadas (comportamientos especiales con compensaciones negativas y, en Bashes más recientes, longitudes negativas):
${parameter:offset}
${parameter:offset:length}
${parameter:offset:length}
Y, por supuesto, las expansiones más útiles que operan en función de si el parámetro es nulo:
${parameter:+use this if param is NOT null}
${parameter:-use this if param is null}
${parameter:=use this and assign to param if param is null}
${parameter:?show this error if param is null}
Tienen más comportamientos que los que se enumeran, y como dije, hay otras formas de manipular cadenas (una común es $ (sustitución de comandos)
combinada con sed o cualquier otro filtro externo) . Pero, se encuentran tan fácilmente al escribir man bash
que no creo que valga la pena extender más esta publicación.
En bash puedes probar esto:
stringZ=abcABC123ABCabc
# 0123456789.....
# 0-based indexing.
echo ${stringZ:0:2} # prints ab
Más ejemplos en El Proyecto de Documentación de Linux
expr (1)
tiene un subcomando substr:
expr substr <string> <start-index> <length>
Esto puede ser útil si no tienes bash (quizás Linux incrustado) y no quieres el extra " echo " proceso que necesita utilizar cortar (1).
${string:position:length}