と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
bash
SHエミュレーション中4.3以降、ksh93t以降またはzshの(中けれどもzsh
、あなたではなく、単純にやるだろうとfield=("${(@s:_:)field}")
のスプリット+グロブ非センス演算子を使用するよりも、分割のためにsh
)あなたは上の文字列を分割でき_
、文字と終了からそれらを参照:
IFS=_
set -o noglob
field=($file) # split+glob operator
date=${field[-1]%.*}
name=${field[-2]}
id=${field[-3]}
product=${field[-4]}
または(bash 3.2以降):
if [[ $file =~ .*_(.*)_(.*)_(.*)_(.*)\.csv$ ]]; then
product=${BASH_REMATCH[1]}
id=${BASH_REMATCH[2]}
name=${BASH_REMATCH[3]}
date=${BASH_REMATCH[4]}
fi
($file
現在のロケールで有効なテキストが含まれていることを前提としていますが、ロケールをCまたは文字ごとに1バイト文字セットのその他のロケールに修正しない限り、ファイル名は保証されません)。
同様zsh
の*
上記の、.*
ある貪欲。したがって、最初のものは*_
できるだけ多くを食べるので、残り.*
は_
-free文字列とのみ一致します。
でksh93
、あなたはできる
pattern='*_(*)_(*)_(*)_(*).csv'
product=${file//$pattern/\1}
id=${file//$pattern/\2}
name=${file//$pattern/\3}
date=${file//$pattern/\4}
POSIX sh
スクリプトでは${var#pattern}
、${var%pattern}
標準のパラメーター展開演算子を使用できます。
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##*_}
または、split + glob演算子をもう一度使用します。
IFS=_
set -o noglob
set -- $file
shift "$(($# - 4))"
product=$1 id=$2 name=$3 date=${4%.*}