파일 이름을 잘라내는 AWK 명령

파일 이름을 잘라내는 AWK 명령
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를 추출합니다.

파일 이름에 공백 문자가 포함되어 있지 않다고 가정합니다.

관련 정보