Angenommen, ich habe eine Liste von CSV-Dateien mit dem folgenden Format:
INT_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
ASG_B1_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
Die INT_V1_ & ASG_B1_V1_ ist festgelegt, was bedeutet , alle CSV - Dateien mit ihm beginnen.
Wie kann ich die Dateinamen in Variablen aufteilen?
Zum Beispiel wollte ich den Namen erfassen und einer Variablen zuweisen $Name
.
Antworten:
Mit
zsh
:Mit
bash
4.3 oder neuer, ksh93t oder neuer oder zsh in der Sh-Emulation (obwohlzsh
Sie dies eherfield=("${(@s:_:)field}")
zum Teilen tun als mit dem unsinnigen Operator split + glob vonsh
) können Sie die Zeichenfolge auf_
Zeichen aufteilen und sie vom Ende aus referenzieren ::Oder (Bash 3.2 oder neuer):
(Dies setzt voraus, dass
$file
das aktuelle Gebietsschema gültigen Text enthält, der für Dateinamen nur dann garantiert wird, wenn Sie das Gebietsschema auf C oder ein anderes Gebietsschema mit einem Einzelbyte-Zeichensatz pro Zeichen festlegen.)Wie
zsh
‚s*
oben, das.*
ist gierig . Der erste frisst also so viele*_
wie möglich, der Rest.*
passt nur zu_
freien Saiten.Mit
ksh93
könnte man machenIn einem POSIX -
sh
Skript, können Sie die verwenden${var#pattern}
,${var%pattern}
Standardparameter Expansion Operatoren:Oder verwenden Sie den Operator split + glob erneut:
quelle
ksh: file: 0403-046 The specified subscript cannot be greater than 4095.
für${field[-1]}
oder irgendetwas in der Form angibt${x[n]}
.${field[-1]}
war fürbash-4.3+
. Fürksh
verwenden, eine der „POSIX“ Lösungen. Die Unterstützung für negative Indizes wurde vor ksh93t (eine Funktion mit Ursprung in zsh) nicht hinzugefügt.<Name>
Mit diesem Befehl können Sie die Werte Ihres Feldes übernehmen :(oder mit
awk
):Und Sie können sie in eine Variable wie diese einfügen:
oder
In der Frage ist nicht klar, ob Sie für alle Werte dieselbe Variable oder für jeden eine einzelne Variable wünschen.
quelle
quelle
_
nichts Besonderes ist und nicht zitiert werden muss. Dies setzt voraus, dass der Dateiname keine Zeilenumbrüche enthält. Möglicherweise möchten Sie eine hinzufügen-d ''
.