파일 이름 파서

파일 이름 파서

파일 이름을 구문 분석하고 이를 기반으로 변수(코드)를 할당하고 싶습니다. 컷을 사용하여 각 값을 얻을 수 있다고 생각합니다. 그런데 명령 하나로 할 수 있을까요?

샘플 파일 이름: 012345678_012345678-abcdefghijklmnop_YYYYMMDD_TTTT

2차 예선부터 시작012345678변수(코드)에 값을 할당해야 합니다.

col-2와 col-3이 yy이고 col-4와 col-5가 00, 01 또는 02이고 col 678이 'abc'인 경우 할당 코드 = usa

col-2와 col-3이 yy이고 col-4와 col-5가 00, 01 또는 02이고 col 678이 'abc'와 같지 않은 경우 할당 코드 = uk

col-2 & col-3이 yy와 같지 않고 col-4 & col-5가 00, 01 또는 02와 같지 않고 col 678이 'abc'와 같지 않은 경우 코드 = Aus를 지정하십시오.

노트: 두 번째 한정자는 항상 첫 번째 밑줄 뒤와 첫 번째 대시 앞에 옵니다. yy는 col -2 및 col-3 위치에 있는 두 번째 한정자의 값입니다.

파일 이름 예시: 012345678_01yy00abc-xxxxxxxxxxxxxxxxxxxxx_20180408_1300 할당 코드 = usa

파일 이름 예: 012345678_01yy00xyz-xxxxxxxxxxxxxxxxxxxxx_20180408_1300 할당 코드 = uk

파일 이름 예시: 012345678_01aa98def-xxxxxxxxxxxxxxxxxxxxx_20180408_1300 할당 코드 = Aus(즉, 미국이나 영국이 아닌 경우 Aus)

답변1

다음 bash 스크립트는 현재 디렉터리에서 패턴(무언가) 밑줄(무엇) 대시(무엇) 밑줄(무엇) 밑줄(무엇)과 일치하는 모든 파일을 반복한 다음 비교할 관련 필드를 선택합니다. 이 구문의 의미는 ${field:4:2}위치 4에서 시작하는 값을 가져오고 두 문자를 추출하는 것입니다.$field

그런 다음 나열된 논리를 기반으로 부품을 비교하고 code변수를 할당합니다.

#!/bin/bash

for f in *_*-*_*_*
do
  field=${f#*_}
  field=${field%%-*}

  col23=${field:2:2}
  col45=${field:4:2}
  col678=${field:6:3}

  if [ "$col23" = "yy" ]
  then
    case $col45 in
      (00|01|02)
        if [ "$col678" = "abc" ]
        then
                code=usa
        else
                code=uk
        fi
        ;;
      (*)
        code=Aus
        ;;
    esac
  else
    code=Aus
  fi
  echo "For file $f, code is: $code"
done

답변2

단 하나의 정규식으로 모든 필드를 제공합니다.
모든 조건을 테스트하려면 하나의 사례 문만 필요합니다.

#!/bin/bash

a='[^_]+_'    b='[^-]{2}'    c='[^-]{3}'
regex="^$a($b($b)($b)($c))-$a$a.*$"

for f in *_*-*_*_*; do
    if [[ $f =~ $regex ]]; then

        arr=("${BASH_REMATCH[@]:1}")
        # echo "field=${arr[0]} col23=${arr[1]} col45=${arr[2]} col678=${arr[3]}"

        a=0; b=0; c=0
        [[ ${arr[1]} == "yy"        ]] && a=1
        [[ ${arr[2]} == @(00|01|02) ]] && b=1
        [[ ${arr[3]} == "abc"       ]] && c=1
        case $a$b$c in
            (111) code=usa ;;
            (110) code=uk  ;;
            (*)   code=Aus ;;
        esac
        echo "For file $f, code is: $code"
    fi
done

관련 정보