Supposons que j'ai une liste de fichiers csv au format suivant:
INT_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
ASG_B1_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
Le INT_V1_ & ASG_B1_V1_ est fixe, ce qui signifie tous les fichiers csv commencent avec elle.
Comment puis-je diviser les noms de fichiers en variables?
Par exemple, je voulais capturer le nom et l'attribuer à une variable $Name
.
Réponses:
Avec
zsh
:Avec
bash
4.3 ou plus récent, ksh93t ou plus récent ou zsh dans l'émulation sh (bien que danszsh
, vous préférez tout simplement fairefield=("${(@s:_:)field}")
pour le fractionnement plutôt que d'utiliser l'opérateur de non-sens split + glob desh
), vous pouvez diviser la chaîne en_
caractères et les référencer depuis la fin :Ou (bash 3.2 ou plus récent):
(cela suppose qu'il
$file
contient du texte valide dans les paramètres régionaux actuels, ce qui n'est pas garanti pour les noms de fichiers, sauf si vous fixez les paramètres régionaux à C ou à d'autres paramètres régionaux avec un seul octet par jeu de caractères).Comme
zsh
« est*
ci - dessus, l'.*
est avide . Ainsi, le premier en mangera autant*_
que possible, de sorte que le reste.*
ne correspondra qu'à des_
chaînes libres.Avec
ksh93
, tu pourrais faireDans un POSIX
sh
script, vous pouvez utiliser les${var#pattern}
,${var%pattern}
opérateurs d'extension de paramètres standard:Ou utilisez à nouveau l'opérateur split + glob:
la source
ksh: file: 0403-046 The specified subscript cannot be greater than 4095.
pour${field[-1]}
ou quoi que ce soit sous forme${x[n]}
.${field[-1]}
c'était pourbash-4.3+
. Pourksh
, utilisez l'une des solutions "POSIX". La prise en charge de l'indice négatif n'a pas été ajoutée avant ksh93t (une fonctionnalité originaire de zsh).Vous pouvez prendre les valeurs de votre champ
<Name>
avec cette commande:(ou avec
awk
):Et vous pouvez les mettre dans une variable comme celle-ci:
ou
Il n'est pas clair dans la question si vous voulez la même variable pour toutes les valeurs ou une seule variable pour chacune d'elles.
la source
la source
_
n'est pas spécial et n'a pas besoin d'être cité. Cela suppose que le nom de fichier ne contient pas de caractères de nouvelle ligne. Vous voudrez peut-être ajouter un-d ''
.