Con zsh:
file='INT_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv'
setopt extendedglob
if [[ $file = (#b)*_(*)_(*)_(*)_(*).csv ]]; then
product=$match[1] id=$match[2] name=$match[3] date=$match[4]
fi
Con bash4.3 o más reciente, ksh93t o más nuevo o zsh en emulación sh (aunque en zsh, preferiría simplemente field=("${(@s:_:)field}")dividir en lugar de usar el operador sin sentido split + glob de sh) podría dividir la cadena en los _caracteres y hacer referencia a ellos desde el final :
IFS=_
set -o noglob
field=($file) # split+glob operator
date=${field[-1]%.*}
name=${field[-2]}
id=${field[-3]}
product=${field[-4]}
O (bash 3.2 o más reciente):
if [[ $file =~ .*_(.*)_(.*)_(.*)_(.*)\.csv$ ]]; then
product=${BASH_REMATCH[1]}
id=${BASH_REMATCH[2]}
name=${BASH_REMATCH[3]}
date=${BASH_REMATCH[4]}
fi
(se supone que $filecontiene texto válido en la configuración regional actual que no está garantizado para los nombres de archivo a menos que arregle la configuración regional en C u otra configuración regional con un solo byte por juego de caracteres).
Como zshel de *arriba, .*es codicioso . Entonces, el primero comerá la mayor cantidad *_posible, por lo que el resto .*solo coincidirá con _cadenas libres.
Con ksh93, podrías hacer
pattern='*_(*)_(*)_(*)_(*).csv'
product=${file//$pattern/\1}
id=${file//$pattern/\2}
name=${file//$pattern/\3}
date=${file//$pattern/\4}
En un POSIX shscript, podría utilizar los ${var#pattern}, ${var%pattern}operadores de expansión de parámetros estándar:
rest=${file%.*} # remove .csv suffix
date=${rest##*_} # remove everything on the left up to the rightmost _
rest=${rest%_*} # remove one _* from the right
name=${rest##*_}
rest=${rest%_*}
id=${rest##*_}
rest=${rest%_*}
product=${rest##*_}
O use el operador split + glob nuevamente:
IFS=_
set -o noglob
set -- $file
shift "$(($# - 4))"
product=$1 id=$2 name=$3 date=${4%.*}