Wie analysiere ich einen String?

1954
Russ Bradberry

Ich bin neu in der bash-Software und erstelle ein Skript, das die Dateien in einem Verzeichnis durchläuft und basierend auf einem Teil des Dateinamens etwas mit der Datei macht. Bisher habe ich Folgendes:

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

also so $fetwas ausgeben: /Users/me/Documents/import/time_dim-1272037430173 davon will ich tgleich aus time_dim, das verzeichnis kann variable länge haben und -1272037430173hat eine feste länge (es ist der unix timestamp btw).

Wie gehen Sie am besten vor?

1

3 Antworten auf die Frage

4
coneslayer

Ungetestet:

t=`basename $f | sed -e 's/-[0-9]\+$//'` 
es ist nah, es gibt `time_dim-1272037429351` zurück Russ Bradberry vor 14 Jahren 0
Versuchen Sie die bearbeitete Version oben (`+` in `\ +` entsprechend der Dokumentation des regulären Ausdrucks von GNU sed geändert.) coneslayer vor 14 Jahren 0
funktioniert immer noch nicht, aber ich habe folgendes bekommen: `t =` basename $ f | sed 's / - [^ -] * $ //' `` Russ Bradberry vor 14 Jahren 1
Das einzige Problem, das ich habe, ist, dass `t` alles vor der Ausführung des Echos verkettet. Ich bekomme also etwas wie:` Loading / Users / me / Documents / import / * in date_dim demographic_dim event_log_facts ip_dim location_dim referal_dim time_dim` und nicht `Laden von / Users / me / Documents / import / time_dim-1272037430173 in time_dim ...` usw Russ Bradberry vor 14 Jahren 0
Oh, ich glaube nicht, dass Sie die Dateien tatsächlich durchlaufen. Versuchen Sie, die Anführungszeichen um $ DIR zu entfernen: `für f in $ DIR` .... Persönlich würde ich` DIR = / Users / me / Documents / import` sagen (so dass $ DIR nur ein Verzeichnis ist, wie der Name schon sagt ) und dann "für f in $ DIR / *", aber das ist Geschmackssache. coneslayer vor 14 Jahren 1
0
jch

Sie könnten auch tun:

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

$ t=`basename $f|gawk -F- ''`

bearbeitet: Ich habe die Frage falsch gelesen

0
user31894
What is the best way to go about this? 

the "best" way, using just bash internals, :)

$ s=/Users/me/Documents/import/time_dim-1272037430173 $ echo $ /Users/me/Documents/import/time_dim $ t=$ $ echo $ time_dim