Pergunta

Eu tenho um nome de arquivo em um formato como:

system-source-yyyymmdd.dat

Gostaria de poder analisar os diferentes bits do nome do arquivo usando o "-" como delimitador.

Foi útil?

Solução

Você pode usar o comando cortar para chegar a cada um dos 3 'campos', por exemplo:

$ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
source

"-d" especifica o delimitador, "-f" especifica o número do campo que você precisa

Outras dicas

Uma coisa legal e elegante (na minha opinião :-) usando apenas built-ins é colocá-lo em um array

var='system-source-yyyymmdd.dat'
parts=(${var//-/ })

Então, você pode encontrar as partes na matriz ...

echo ${parts[0]}  ==> system
echo ${parts[1]}  ==> source
echo ${parts[2]}  ==> yyyymmdd.dat

Embargo:isso não funcionará se o nome do arquivo contiver caracteres "estranhos", como espaço ou, Deus me livre, aspas, crases...

Dependendo de suas necessidades, estranho é mais flexível do que cortado.Um primeiro 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

O problema é que descrever o awk como 'mais flexível' é certamente como chamar o iPhone de um telefone celular aprimorado ;-)

Use o cut comando.

por exemplo.

echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'

irá extrair o primeiro bit.

Altere o valor do -f parâmetro para obter as peças apropriadas.

Aqui está um guia sobre Corte comando.

Outro método é usar as ferramentas de análise internas do shell, o que evita o custo de criação de processos filhos:

oIFS=$IFS
IFS=-
file="system-source-yyyymmdd.dat"
set $file
IFS=$oIFS
echo "Source is $2"

A maneira mais simples (e a melhor maneira da IMO) de fazer isso é simplesmente usar read:

$ IFS=-. read system source date ext << EOF
> foo-bar-yyyymmdd.dat
> EOF
$ echo $system
foo
$ echo $source $date $ext
bar yyyymmdd dat

Existem muitas variações desse tema, muitas das quais dependem do 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top