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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top