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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top