Que tal esta receita ' sed
'?
echo "DSA4020_frontcover_20346501_2011-05.doc" \ | sed 's|\([^_]*\)_\([^_]*\)_\([^_]*\)_\([^\.]*\).*|name=,type=,id=,date=|'
fornece este ótimo formulário CSV,
name=DSA4020,type=frontcover,id=20346501,date=2011-05
Como posso recuperar cada parte separadamente do seguinte nome de arquivo?
DSA4020_frontcover_20346501_2011-05.doc
Eu quero recuperar as informações abaixo:
name = DSA4020
type = frontcover
id = 20346501
date = 2011-05
É possível fazer isso com sed?
Que tal esta receita ' sed
'?
echo "DSA4020_frontcover_20346501_2011-05.doc" \ | sed 's|\([^_]*\)_\([^_]*\)_\([^_]*\)_\([^\.]*\).*|name=,type=,id=,date=|'
fornece este ótimo formulário CSV,
name=DSA4020,type=frontcover,id=20346501,date=2011-05
Você pode usar o seguinte para dividir a cada _ depois de remover a extensão:
$ echo "DSA4020_frontcover_20346501_2011-05.doc" | cut -d. -f-1 | cut -d_ -f1
DSA4020
Substitua o último dígito por 2, 3, 4 para obter o valor individual de cada vez.
Se o número de campos for constante:
for i in 1 2 3 4 5; do
VARS[${i}]=$(echo ${yourfilename} | cut -d _ -f${i})
done
Em seguida, acesse $ {VARS [i]} ...
Alternativa:
VARS[${i}]=$(echo ${yourfilename} | awk -v i=${i} -F_ '{print $i}'
E, se suportado (bash 3 +)
for i in {1..5}; do (...)
Se você tiver vários nomes de arquivos, basta adicionar um for
loop para percorrer todos eles.
Divida o nome do arquivo e armazene em parâmetros posicionais:
set -- $(sed 's/_/ /g' <<< ${filename%.doc})
name=$1
type=$2
id=$3
date=$4
Tente isto:
echo "DSA4020_frontcover_20346501_2011-05.doc" | awk -F '_' '{print " name =" $1 "\n type =" $2 "\n id =" $3 "\n date =" $4 } '
a saída será assim:
name = DSA4020
type = frontcover
id = 20346501
date = 2011-05