fileName=20201211-v1-ABC144_newrecords_2020-12-10_12-51-32-000_2444_511
fName1=$(echo $fileName | awk -F"-" '{ print $3 }')
파일 이름을 $3에서 만료 날짜 값으로 줄였습니다.
다음과 같은 파일 이름이 필요합니다.
ABC144_newrecords_2020-12-10_12
답변1
패턴을 따르는 문자열 부분을 추출하려면 다음을 사용할 수 있습니다 expr
.
expr " $fileName" : '[^-]*-[^-]*-\(.*_[0-9]\{4\}-[01][0-9]-[0-3][0-9]\)_'
-
(여기서는 2번째 이후부터 가장 오른쪽까지 나오는 부분을 추출합니다. _YYYY-MM-DD_
( _
트레일링은 제외))
또는 다음을 사용하여 zsh
:
set -o extendedglob
[[ $fileName = (#b)[^-]#-[^-]#-(*_[0-9](#c4)-[01][0-9]-[0-3][0-9])_* ]] &&
print -r - $match[1]
또는:
set -o rematchpcre
[[ $fileName =~ '^.*?-.*?-(.*_\d{4}-[01]\d-[0-3]\d)_' ]] &&
print -r - $match[1]
또는 다음을 사용하여 ksh93
:
printf '%s\n' "${fileName/#*([^-])-*([^-])-@(*_{4}(\d)-[01][0-9]-[0-3][0-9])_*/\3}"
또는 다음을 사용하여 bash
:
[[ $fileName =~ ^[^-]*-[^-]*-(.*_[0-9]{4}-[01][0-9]-[0-3][0-9])_ ]] &&
printf '%s\n' "${BASH_REMATCH[1]}"
답변2
-
value 에서 dash()로 구분된 처음 두 개와 마지막 세 개의 문자열을 제거 하려는 것 같습니다 $fileName
. 이는 매개변수 대체를 통해 가장 효율적으로 수행됩니다("효율적" = 외부 프로그램을 사용하지 않고 셸만 사용).
$ fileName=20201211-v1-ABC144_newrecords_2020-12-10_12-51-32-000_2444_511
$ fileName=${fileName#*-*-}
$ echo "$fileName"
ABC144_newrecords_2020-12-10_12-51-32-000_2444_511
$ fileName=${fileName%-*-*-*}
$ echo "$fileName"
ABC144_newrecords_2020-12-10_12
교체는 값이 되지만 ${fileName#*-*-}
처음 부분의 $fileName
패턴과 일치하는 비트는 제거됩니다. *-*-
비슷한 방식으로 ${fileName%-*-*-*}
가 될 것이지만 $fileName
끝에 일치하는 비트를 제거합니다.-*-*-*
답변3
가장 쉬운 방법은 아마도 cut을 사용하는 것입니다.
printf '%s\n' "$fileName" | cut -d- -f3-5
이는 구분 기호를 "-"로 설정하고 필드 3-5를 추출합니다.
파일 이름에 공백 문자가 포함되어 있지 않다고 가정합니다.