¿Qué comando linux shell devuelve una parte de una cadena? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Quiero encontrar un comando 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 ser usado para este propósito. Quiero ser capaz de hacer algo como esto... substr "abcdefg" 2 3 - impresiones cde.


Pregunta similar posterior:

Author: Community, 2008-10-20

6 answers

Si está buscando una utilidad de shell para hacer algo así, puede usar el comando cut.

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.

 144
Author: Toybuilder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-28 10:58:58

De 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 cut.

 89
Author: dmckee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-28 15:12:14

En" pure " bash tienes 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 muy útiles que operan sobre 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 comportamientos más modificables que los enumerados, y como dije, hay otras formas de manipular cadenas (una común es $(command substitution) combinada con sed o cualquier otro filtro externo). Pero, se encuentran tan fácilmente al escribir man bash que no creo que merezca la pena extender aún más este post.

 31
Author: ata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-12 21:16:11

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

 17
Author: Juanma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-20 18:42:06

expr(1) tiene un subcomando substr:

expr substr <string> <start-index> <length>

Esto puede ser útil si no tiene bash (quizás Linux incrustado) y no desea el proceso "echo" adicional que necesita para usar cut(1).

 13
Author: camh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-20 12:06:23
${string:position:length}
 3
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-20 18:37:54