Como dividir um nome de arquivo em um delimitador especificado

Como dividir um nome de arquivo em um delimitador especificado

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

A saída deve ser: "nome do arquivo" "120516"

Estou querendo realizar esta operação no bash, se possível. Ainda estou aprendendo e tenho muito pouca experiência em bash. Quaisquer explicações junto com o código são muito bem-vindas.

Responder1

"no 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

Responder2

Se bem entendi, esse comando deve funcionar (se não houver '(' e '.' No nome do arquivo)

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

Divida-os em 2 variáveis:

filename=$(echo $file | cut -d"(" -f1)
number=$(echo $file | cut -d"(" -f2 | cut -d"." -f1)

Responder3

Usarexpansão de parâmetrostruncamento.

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

informação relacionada