Cómo dividir un nombre de archivo en un delimitador específico

Cómo dividir un nombre de archivo en un delimitador específico

Tengo alrededor de 200 nombres de archivos de los que intento extraer datos. El formato es algo así como: nombre de archivo (120516.1108).mp3. Estoy intentando extraer la parte antes de "(" y también la parte antes de ".". Tampoco todos los archivos tienen este formato, por lo que hay un formato adicional. desafío.

La salida debería ser: "nombre de archivo" "120516"

Quiero realizar esta operación en bash si es posible. Todavía estoy aprendiendo y tengo muy poca experiencia en bash. Cualquier explicación junto con el código es bienvenida.

Respuesta1

"en bash", algo como:

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

Entonces

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

Respuesta2

Si entiendo correctamente, ese comando debería funcionar (si no hay '(' y '.' en el nombre del archivo)

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

Divídalos en 2 variables:

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

Respuesta3

Usarexpansión de parámetrostruncamiento.

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

información relacionada