¿Cómo analizar un nombre de archivo en bash?
Pregunta
Tengo un nombre de archivo en un formato como:
system-source-yyyymmdd.dat
Me gustaría ser capaz de analizar los diferentes bits de la nombre de archivo utilizando el "-" como un delimitador.
Solución
Usted puede utilizar el el comando cut para llegar a cada uno de los 3 'campos', p. ej.:
$ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
source
"-d" especifica el delimitador, "-f" especifica el número del campo que requieren
Otros consejos
Un bonito y elegante (en mi mente :-) utilizando sólo construido-ins es ponerlo en una matriz
var='system-source-yyyymmdd.dat'
parts=(${var//-/ })
Entonces, usted puede encontrar las piezas de la matriz...
echo ${parts[0]} ==> system
echo ${parts[1]} ==> source
echo ${parts[2]} ==> yyyymmdd.dat
Advertencia:esto no funcionará si el nombre de archivo contiene "extraño" de los personajes, tales como el espacio, o, el cielo prohíbe, entre comillas, de acentos graves...
Dependiendo de sus necesidades, awk es más flexible que la de corte.Un primer 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
El problema es que al describir awk como "más flexible" es, ciertamente, como llamar a el iPhone una mejorada del teléfono celular ;-)
El uso de la cut
comando.
por ejemplo,
echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'
se extrae el primer bit.
Cambie el valor de la -f
parámetro para obtener las partes apropiadas.
He aquí una guía sobre la Cortar comando.
Otro método es utilizar la cáscara interna del análisis de las herramientas, lo que evita el costo de la creación de procesos hijos:
oIFS=$IFS IFS=- file="system-source-yyyymmdd.dat" set $file IFS=$oIFS echo "Source is $2"
El más sencillo (y de la OMI mejor manera) a hacer esto simplemente es usar read
:
$ IFS=-. read system source date ext << EOF
> foo-bar-yyyymmdd.dat
> EOF
$ echo $system
foo
$ echo $source $date $ext
bar yyyymmdd dat
Hay muchas variaciones sobre este tema, muchos de los cuales son shell dependiente:
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