Como faço para analisar uma string?

1

Eu sou novo para bash, e estou criando um script que percorre os arquivos em um diretório e com base em parte do nome do arquivo, faz algo com o arquivo, até agora eu tenho isso:

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

assim $f irá produzir algo como isto: /Users/me/Documents/import/time_dim-1272037430173 fora disso, eu quero t igualar time_dim, o diretório pode ser de tamanho variável e -1272037430173 é um tamanho fixo (é o timestamp do unix btw).

Qual é a melhor maneira de fazer isso?

Russ Bradberry
fonte

Respostas:

4

Não testado:

t=`basename $f | sed -e 's/-[0-9]\+$//'`
coneslayer
fonte
está perto, está voltando time_dim-1272037429351
Russ Bradberry
Tente a versão editada acima ( + mudou para \+ de acordo com a documentação de expressão regular do GNU sed)
coneslayer
1
ainda não funciona, mas eu tenho isso para: t= nome de base $ f | sed 's / - [^ -] * $ //' ``
Russ Bradberry
o único problema que estou tendo é que t está concatenando tudo isso antes de executar o eco, então eu recebo algo como: Loading /Users/me/Documents/import/* into date_dim demographic_dim event_log_facts ip_dim location_dim referal_dim time_dim ao invés de Loading /Users/me/Documents/import/time_dim-1272037430173 into time_dim... etc etc
Russ Bradberry
1
Eu não acho que você está realmente passando os arquivos. Tente remover as cotações em torno de $ DIR: for f in $DIR .... Pessoalmente, eu diria DIR=/Users/me/Documents/import (de modo que $ DIR é apenas um diretório, como o nome sugere) e depois for f in $DIR/* mas isso é uma questão de gosto.
coneslayer
0

você também pode fazer:

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

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

editado: eu interpretei mal a questão

jch
fonte
0
What is the best way to go about this? 

o "melhor" caminho, usando apenas bash internals, :)

$ s=/Users/me/Documents/import/time_dim-1272037430173
$  echo ${s%-*}
/Users/me/Documents/import/time_dim
$ t=${s%-*}
$ echo ${t##*/}
time_dim
user31894
fonte