다음 형식의 csv 파일 목록이 있다고 가정합니다.
INT_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
ASG_B1_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
INT_V1_ & ASG_B1_V1_는 모든 CSV 파일이 시작을 의미 고정됩니다.
파일 이름을 어떻게 변수로 나눌 수 있습니까?
예를 들어, 이름 을 캡처하여 변수에 할당하고 싶었습니다 $Name
.
와 함께 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
쉬 에뮬레이션 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 또는 기타 로케일로 수정하지 않는 한 파일 이름에 대해 보장되지 않습니다.)
등 zsh
의 *
(가), 위 .*
입니다 욕심 . 따라서 첫 번째 *_
것은 가능한 한 많이 먹으 므로 나머지 .*
는 _
자유 문자열 과 만 일치 합니다.
으로 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%.*}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다