script - ¿Cómo se analiza un nombre de archivo en bash?
scripts bash ejemplos (6)
Tengo un nombre de archivo en un formato como:
system-source-yyyymmdd.dat
Me gustaría poder analizar los diferentes bits del nombre de archivo con "-" como delimitador.
Dependiendo de sus necesidades, awk es más flexible que cortar. Un primer adelanto:
# 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 describir awk como ''más flexible'' es ciertamente como llamar al iPhone un teléfono celular mejorado ;-)
La forma más simple (y la mejor manera de IMO) para hacer esto es simplemente 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 en ese tema, muchas de las cuales dependen del 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
Otro método es usar las herramientas internas de análisis del shell, lo que evita el costo de crear procesos hijos:
oIFS=$IFS IFS=- file="system-source-yyyymmdd.dat" set $file IFS=$oIFS echo "Source is $2"
Puede utilizar el comando de corte para obtener cada uno de los 3 ''campos'', por ejemplo:
$ echo "system-source-yyyymmdd.dat" | cut -d''-'' -f2
source
"-d" especifica el delimitador, "-f" especifica el número del campo que necesita
Un lindo y elegante (en mi mente :-) usar solo complementos es ponerlo en una matriz
var=''system-source-yyyymmdd.dat''
parts=(${var//-/ })
Entonces, puedes encontrar las partes en la matriz ...
echo ${parts[0]} ==> system
echo ${parts[1]} ==> source
echo ${parts[2]} ==> yyyymmdd.dat
Advertencia: esto no funcionará si el nombre del archivo contiene caracteres "extraños" como espacio, o, el cielo prohíbe, comillas, comillas inversas ...
Use el comando de cut
.
p.ej
echo "system-source-yyyymmdd.dat" | cut -f1 -d''-''
extraerá el primer bit.
Cambia el valor del parámetro -f
para obtener las partes apropiadas.
Aquí hay una guía sobre el comando Cut .