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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top