Como dividir um nome de arquivo em um delimitador especificado

3

Tenho cerca de 200 nomes de arquivos dos quais estou tentando extrair dados. O formato é algo como: filename (120516.1108) .mp3 Eu estou tentando puxar a parte antes do "(" e também a parte antes do ".". Nem todos os arquivos têm este formato, então há um extra desafio.

A saída deve ser: "filename" "120516"

Eu estou querendo executar esta operação no bash, se possível. Eu ainda estou aprendendo e tenho pouca experiência em bash. Qualquer explicação junto com o código é muito bem-vinda.

    
por John Smith 31.05.2017 / 15:41

3 respostas

0

Se eu entendi corretamente que o comando deve funcionar (se não houver '(' e '.' no nome do arquivo)

data=$(echo $file | cut -d"." -f1 | tr -d "(")

Divida-os em duas variáveis:

filename=$(echo $file | cut -d"(" -f1)
number=$(echo $file | cut -d"(" -f2 | cut -d"." -f1)
    
por 31.05.2017 / 15:54
3

"in bash", algo como:

re='^(.*)\(([0-9]+)\.[0-9]+\).*$'

Então

for f in *.mp3; do 
  [[ $f =~ $re ]] && printf '"%s" "%s"\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
done
    
por 31.05.2017 / 16:01
1

Use a truncagem expansão de parâmetros .

case "$filename" in
  *\(*.*\)*)
    before_first_parenthesis=${filename%%\(*}
    after_first_parenthesis=${filename#*\(}
    before_dot=${after_first_parenthesis%%.*}
    echo "$before_first_parenthesis" "$before_dot"
  *) echo "does not match the format";;
esac
    
por 01.06.2017 / 00:47