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