¿Cómo analizo una cadena?


1

Soy nuevo en bash, y estoy creando un script que recorre los archivos en un directorio y, según parte del nombre del archivo, hace algo con el archivo, hasta ahora tengo esto:

#!/bin/bash
DIR="/Users/me/Documents/import/*"
for f in "$DIR"
do
  t=??????
  echo "Loading $f into $t..."
done

entonces $fgenerará algo como esto: /Users/me/Documents/import/time_dim-1272037430173 fuera de esto, quiero tigualar time_dim, el directorio puede ser de longitud variable y -1272037430173es una longitud fija (es la marca de tiempo de Unix por cierto).

¿Cuál es la mejor manera de hacer esto?

Respuestas:


4

No probado:

t=`basename $f | sed -e 's/-[0-9]\+$//'`

está cerca, está volviendotime_dim-1272037429351
Russ Bradberry

Pruebe la versión editada arriba ( +modificada de \+acuerdo con la documentación de expresión regular de GNU sed)
coneslayer

1
todavía no funciona, pero obtuve esto para: t=basename $ f | sed 's / - [^ -] * $ //' ``
Russ Bradberry

El único problema que estoy teniendo es que tes la concatenación de todos de la misma antes de ejecutar el eco, así que conseguir algo como: Loading /Users/me/Documents/import/* into date_dim demographic_dim event_log_facts ip_dim location_dim referal_dim time_dimen lugar de Loading /Users/me/Documents/import/time_dim-1272037430173 into time_dim..., etc, etc
Russ Bradberry

1
Oh, no creo que realmente estés recorriendo los archivos. Intente eliminar las comillas alrededor de $ DIR: for f in $DIR.... Personalmente, diría DIR=/Users/me/Documents/import(de modo que $ DIR es solo un directorio, como su nombre lo indica) y luego, for f in $DIR/*pero eso es cuestión de gustos.
coneslayer

0

también podrías hacer:

$ t=`basename $f|tr -d '[0-9-]'`
o

$ t=`basename $f|gawk -F- '{print $1;}'`

editado: leí mal la pregunta


0
What is the best way to go about this? 

la "mejor" forma, usando solo bash internos, :)

$ s=/Users/me/Documents/import/time_dim-1272037430173
$  echo ${s%-*}
/Users/me/Documents/import/time_dim
$ t=${s%-*}
$ echo ${t##*/}
time_dim
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.