Subcadenas en Bash

A lo largo de su carrera de programación, encontrará que hay bastantes ocasiones en las que necesita extraer una subcadena de otra cadena. Las cuerdas son una de las más...

A lo largo de su carrera de programación, encontrará que hay bastantes ocasiones en las que necesita extraer una subcadena de otra cadena. Las cadenas son una de las estructuras de datos más comunes, por lo que esto surge con frecuencia. Apuesto a que podrías decirme cómo hacerlo en tu lenguaje de programación favorito, pero ¿y si tuvieras que hacerlo en Intento? No es tan obvio en Bash como en otros idiomas, por lo que explicaremos cómo hacerlo de diferentes maneras en este artículo.

Si tiene experiencia con sistemas operativos basados ​​en Unix, probablemente ya conozca el shell Bash. Pero si no lo hace, aquí hay una explicación rápida. Esencialmente, es un shell de comandos que se escribió inicialmente para el proyecto GNU como reemplazo del shell Bourne. Muchos desarrolladores utilizan el shell Bash como interfaz para escribir código o interactuar con el sistema de archivos de su sistema operativo, así como para ejecutar otros comandos. Por lo tanto, siempre es útil saber cómo realizar una determinada tarea en caso de que lo use con frecuencia o necesite escribir un script de shell.

Usando el comando de corte

Obtener una subcadena de la cadena original usando la terminal no es demasiado difícil gracias a un comando incorporado diseñado específicamente para este propósito. Funciona bien para usar directamente en la línea de comando o dentro de un script de shell (un archivo .sh). El comando al que me refiero es cut, que es un comando Bash que toma una cadena y algunas banderas (-cN-M) como entradas y luego genera la subcadena resultante. Aquí hay un ejemplo del formato del comando:

1
$ echo "STRING" | cut -cN-M

Cuando inserte las variables (tanto la cadena como las banderas), Bash le devolverá los caracteres de la cadena a partir del índice N y terminando en M (con los caracteres en los índices N y M ambos incluidos).

Probemos algunos ejemplos. En el siguiente, usamos la cadena "abcdefghi" y extraemos una subcadena de ella a continuación:

1
2
$ echo "abcdefghi" | cut -c2-6
bcdef

Cuando ejecute el comando anterior en una terminal, obtendrá "bcdef" como resultado.

Especificar el índice de caracteres no es la única forma de extraer una subcadena. También puede usar las banderas -d y -f para extraer una cadena especificando caracteres para dividir. El indicador -d le permite especificar el delimitador para dividir, mientras que -f le permite elegir qué subcadena de la división elegir. Tenga en cuenta que el comando cortar no está indexado en 0, por lo que el primer elemento de la lista comienza en 1.

1
$ echo "STRING" | cut -d'C' -f I

En el ejemplo anterior, C es el carácter para dividir e I es el índice para elegir.

Dado esto, probemos con otro ejemplo. Suponga que tiene que extraer una serie de dígitos del nombre de un directorio. El formato del nombre del directorio podría ser algo como "cumpleaños-091216-fotos". En este ejemplo, hay algunos caracteres antes de los dígitos que nos interesan y un par de caracteres después de ellos. También hay guiones colocados en el medio como se indica. Podemos abordar este problema fácilmente con el comando cortar utilizando la sintaxis anterior que acabamos de presentar. Así es cómo:

1
2
$ echo "birthday-091216-pics" | cut -d'-' -f 2
091216

Esto divide la cadena en una matriz (["cumpleaños", "091216", "fotos"]), y luego toma una imagen de un elemento de esa matriz para devolver (el segundo elemento).

Si, en cambio, necesita usar esto en un script de shell, su código puede verse así:

1
2
3
STR="birthday-091216-pics"
SUBSTR=$(echo $STR | cut -d'-' -f 2)
echo $SUBSTR

Cuando ejecuta los comandos anteriores, obtiene "091216" como salida, igual que antes.

Uso de la sintaxis de subcadenas de Bash

Otra forma de extraer subcadenas en un script de shell es usar una variable Bash con la sintaxis de subcadena. La sintaxis se ve así:

1
2
3
string=YOUR-STRING
echo ${string:P}
echo ${string:P:L}

Aquí P es un número que indica el índice inicial de la subcadena y L es la longitud de la subcadena. Si omite el parámetro L, se devuelve el resto de la cadena, comenzando desde la posición P.

Esto es diferente de antes con el comando cut donde dimos los índices inicial y final. En este caso, tenemos que dar el índice inicial y longitud en su lugar (o ninguna longitud).

Esta forma suele ser más preferida para los scripts de shell, ya que es sintácticamente más compacta y más fácil de leer. Sin embargo, no funciona bien cuando se usa directamente desde la línea de comandos, en cuyo caso probablemente prefiera cortar.

Conclusión

Hay bastantes formas de obtener una subcadena en Bash, algunas de las cuales discutimos aquí. Puede utilizar la función cut o la sintaxis de subcadenas de Bash para extraer cadenas según sus necesidades. Para obtener más información sobre la función cut específicamente (que también se puede usar en archivos), consulte su [página de wikipedia aquí] (https://en.wikipedia.org/wiki/Cut_(Unix)).