Comment analyser un nom de fichier en bash ?
Question
J'ai un nom de fichier dans un format comme :
system-source-yyyymmdd.dat
J'aimerais pouvoir analyser les différents bits du nom de fichier en utilisant le "-" comme délimiteur.
La solution
Vous pouvez utiliser le commande couper pour accéder à chacun des 3 "champs", par exemple :
$ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
source
"-d" spécifie le délimiteur, "-f" spécifie le numéro du champ dont vous avez besoin
Autres conseils
Une manière agréable et élégante (dans mon esprit :-) d'utiliser uniquement des éléments intégrés consiste à le placer dans un tableau
var='system-source-yyyymmdd.dat'
parts=(${var//-/ })
Ensuite, vous pouvez trouver les pièces dans le tableau...
echo ${parts[0]} ==> system
echo ${parts[1]} ==> source
echo ${parts[2]} ==> yyyymmdd.dat
Mise en garde:cela ne fonctionnera pas si le nom de fichier contient des caractères "étranges" tels que des espaces ou, Dieu nous en préserve, des guillemets, des guillemets inversés...
Selon vos besoins, embarrassant est plus souple que coupé.Un premier teaser :
# echo "system-source-yyyymmdd.dat" \
|awk -F- '{printf "System: %s\nSource: %s\nYear: %s\nMonth: %s\nDay: %s\n",
$1,$2,substr($3,1,4),substr($3,5,2),substr($3,7,2)}'
System: system
Source: source
Year: yyyy
Month: mm
Day: dd
Le problème est que décrire awk comme « plus flexible » revient certainement à appeler l'iPhone un téléphone portable amélioré ;-)
Utilisez le cut
commande.
par exemple.
echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'
extraira le premier bit.
Changer la valeur du -f
paramètre pour obtenir les pièces appropriées.
Voici un guide sur le Couper commande.
Une autre méthode consiste à utiliser les outils d'analyse internes du shell, ce qui évite le coût de création de processus enfants :
oIFS=$IFS IFS=- file="system-source-yyyymmdd.dat" set $file IFS=$oIFS echo "Source is $2"
Le moyen le plus simple (et le meilleur selon l'OMI) de procéder est simplement d'utiliser read
:
$ IFS=-. read system source date ext << EOF
> foo-bar-yyyymmdd.dat
> EOF
$ echo $system
foo
$ echo $source $date $ext
bar yyyymmdd dat
Il existe de nombreuses variantes sur ce thème, dont beaucoup dépendent du shell :
bash$ IFS=-. read system source date ext <<< foo-bar-yyyymmdd.dat
echo "$name" | { IFS=-. read system source date ext
echo In all shells, the variables are set here...; }
echo but only in some shells do they retain their value here