scripts script resueltos programas paso operaciones manejo hacer ejercicios ejemplos como comando cadenas aritmeticas bash shell parsing tokenize cut

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 .