Come si analizza un nome file in bash?
Domanda
Ho un nome file in un formato come:
system-source-yyyymmdd.dat
Mi piacerebbe essere in grado di analizzare le diverse parti del nome del file utilizzando "-" come delimitatore.
Soluzione
Puoi usare il comando di taglio per raggiungere ciascuno dei 3 'campi', ad esempio:
$ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
source
"-d" specifica il delimitatore, "-f" specifica il numero del campo richiesto
Altri suggerimenti
Un modo carino ed elegante (nella mia mente :-) di usare solo i built-in è inserirlo in un array
var='system-source-yyyymmdd.dat'
parts=(${var//-/ })
Quindi, puoi trovare le parti nell'array...
echo ${parts[0]} ==> system
echo ${parts[1]} ==> source
echo ${parts[2]} ==> yyyymmdd.dat
Avvertimento:questo non funzionerà se il nome del file contiene caratteri "strani" come spazio o, il cielo non voglia, virgolette, virgolette inverse...
A seconda delle tue esigenze, awk è più flessibile del taglio.Un primo 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
Il problema è che descrivere awk come "più flessibile" è certamente come definire l'iPhone un cellulare potenziato ;-)
Usa il cut
comando.
per esempio.
echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'
estrarrà il primo bit.
Modificare il valore di -f
parametro per ottenere le parti appropriate.
Ecco una guida su Taglio comando.
Un altro metodo consiste nell'utilizzare gli strumenti di analisi interni della shell, che evitano il costo della creazione di processi figli:
oIFS=$IFS IFS=- file="system-source-yyyymmdd.dat" set $file IFS=$oIFS echo "Source is $2"
Il modo più semplice (e secondo me il modo migliore) per farlo è semplicemente usarlo read
:
$ IFS=-. read system source date ext << EOF
> foo-bar-yyyymmdd.dat
> EOF
$ echo $system
foo
$ echo $source $date $ext
bar yyyymmdd dat
Esistono molte variazioni su questo tema, molte delle quali dipendono dalla 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