miércoles, marzo 15, 2017

Subcadenas en bash o slicing

No suelo hacer scripts demasiado complicados usando bash. Cuando veo que la tarea que quiero realizar se complica demasiado o tengo que recurrir a construcciones más o menos esotéricas en shell script paso inmediatamente a Python para implementarla, ya que normalmente, suelo tener disponible dicho lenguaje en mi entorno de trabajo.

Sin embargo, puede ocurrir que no tengamos un lenguaje como perl o python disponible en nuestro entorno - por ejemplo, realizando scripts de arranque para un sistema embebido - y sea necesario realizar ciertas operaciones. En el caso que nos ocupa, manejar subcadenas. Si está disponible awk - y lo normal, en entornos shell script, es que lo esté - se puede usar para realizar esta tarea. Por ejemplo:

example1="Esto es una cadena"
# Selecciona los 4 primeros caracteres
echo $example1| awk '{print ">>" substr($0,1,4) "<<"}'
# Selecciona desde el carácter 6 en adelante
echo $example1| awk '{print ">>" substr($0,6) "<<"}'
# Selecciona los 6 últimos caracteres
echo $example1| awk '{print ">>" substr($0,length($0)-5) "<<"}'
# Selecciona los dos caracteres después de los 6 últimos
echo $example1| awk '{print ">>" substr($0, length($0)-5,2) "<<"}'

Curiosamente, bash tiene una funcionalidad interna que permite la obtención de subcadenas, y que se llama Substring Expansion la cual está documentanda en el manual de referencia de Bash. Para conseguir el mismo efecto que con awk se usaría las siguientes construcciones en bash:

example1="Esto es una cadena"
# Selecciona los 4 primeros caracteres
echo ">>${example1:0:4}<<"
# Selecciona desde el carácter 6 en adelante
echo ">>${example1:5}<<"
# Selecciona los 6 últimos caracteres
echo ">>${example1: -6}<<"
# Selecciona los dos caracteres después de los 6 últimos
echo ">>${example1: -6:2}<<"

Como puede verse la forma es:

${parameter:offset}
${parameter:offset:length}

  • offset es el carácter desde donde empezamos a coger la subcadena. Puede tener un valor negativo, pero en ese caso hay que dejar un espacio entre el dos punto y el signo menos.
  • length es la longitud total de caracteres que queremos sacar de la subcadena. Si se omite, se toma hasta el final de la cadena desde offset.

De esta manera se puede trabajar de manera sencilla con subcadenas en bash con una sintaxis similar al slicing de Python

No hay comentarios: