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 bash
4.3 o più recenti, ksh93t o più recenti o zsh in emulazione sh (sebbene in zsh
, preferiresti semplicemente fare field=("${(@s:_:)field}")
per dividere piuttosto che usare l'operatore non-sense split + glob di sh
) potresti dividere la stringa su _
caratteri e fare riferimento a loro dalla fine :
IFS=_
set -o noglob
field=($file) # split+glob operator
date=${field[-1]%.*}
name=${field[-2]}
id=${field[-3]}
product=${field[-4]}
Oppure (bash 3.2 o più recente):
if [[ $file =~ .*_(.*)_(.*)_(.*)_(.*)\.csv$ ]]; then
product=${BASH_REMATCH[1]}
id=${BASH_REMATCH[2]}
name=${BASH_REMATCH[3]}
date=${BASH_REMATCH[4]}
fi
(ciò presuppone che $file
contenga un testo valido nella locale corrente che non è garantito per i nomi di file a meno che non si corregga la locale su C o altra locale con un set di caratteri a byte singolo per carattere).
Come zsh
'il *
sopra, il .*
è avido . Quindi il primo ne mangerà il maggior numero *_
possibile, quindi il rimanente abbinerà .*
solo _
stringhe libere.
Con ksh93
, potresti fare
pattern='*_(*)_(*)_(*)_(*).csv'
product=${file//$pattern/\1}
id=${file//$pattern/\2}
name=${file//$pattern/\3}
date=${file//$pattern/\4}
In un POSIX sh
script, è possibile utilizzare i ${var#pattern}
, ${var%pattern}
operatori di espansione parametri standard:
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##*_}
Oppure usa nuovamente l'operatore split + glob:
IFS=_
set -o noglob
set -- $file
shift "$(($# - 4))"
product=$1 id=$2 name=$3 date=${4%.*}