Saber la posición de una subcadena en Shell Script

Saber la posición de una subcadena en Shell Script puede ser demencial. En muchos blogs y foros podemos encontrar una serie de fórmulas que a veces funcionan y otras no.

Yo utilizo una que quizá no sea la más ortodoxa, pero funciona. Y funciona siempre. Es la siguiente:

  1. Elimino desde la posición de la subcadena hasta el final y guardo esa cadena en una variable: previous=${string%%$substring*}
  2. Extraigo el número de caracteres de esa cadena y lo guardo en una variable con position=${#previous}

Y ya puedo trabajar con ese índice.

Para ver más claro el resultado y comprobar su veracidad, le voy a decir que me numere en la línea siguiente los caracteres con eval echo {0..$position} | tr -d ' '. Primero, que escriba desde el 0 hasta la posición que ocupe la subcadena ratón y que elimine los espacios en blanco con tr:

#!/bin/bash

substring="ratón"
string="Salió un ratón barbicano"
previous=${string%%$substring*}
position=${#previous}

echo $substring está en el carácter $position de la cadena:
echo $string
eval echo {0..$position} | tr -d ' '

Devuelve:

ratón está en el carácter 9 de la cadena:
Salió un ratón barbicano
0123456789

Nos indica que está en la posición 9 y, como vemos, la «r» de «ratón» está en la posición 9.

No encuentra la subcadena

¿Qué pasaría si no existiera la subcadena?

Al no eliminar desde la subcadena hasta el final,la longitud de la cadena será igual al valor de la variable position.

Si cambio ratón por ratones, devuelve:

ratones está en el carácter 24 de la cadena:
Salió un ratón barbicano
0123456789101112131415161718192021222324

Comprobar si existe la subcadena

Podemos comprobar si una cadena contiene una subcadena con if [[ "$string" == *"$substring"* ]]

#!/bin/bash

substring="ratones"
string="Salió un ratón barbicano"

if [[ "$string" == *"$substring"* ]]
then 
    previous=${string%%$substring*}
    position=${#previous}

    echo $substring está en el carácter $position de la cadena.
else
    echo $substring no está en la cadena
fi

O extraer primero desde la subcadena hasta el final y comprobar si el tamaño de la subcadena resultante es menor que el tamaño de la cadena original:

#!/bin/bash

substring="ratones"
string="Salió un ratón barbicano"

previous=${string%%$substring*}
position=${#previous}

if [[ $position -lt ${#string} ]]
then 
    echo $substring está en el carácter $position de la cadena.
else
    echo $substring no está en la cadena
fi

 

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.