"abcd.log.2017_01_26_23_30.0"과 같은 파일 이름에서 날짜 "2017-01-26"(yyyy-mm-dd)을 추출합니다.

"abcd.log.2017_01_26_23_30.0"과 같은 파일 이름에서 날짜 "2017-01-26"(yyyy-mm-dd)을 추출합니다.

다음 위치에 일부 파일이 있습니다 /mainFolder/test.

abcd.log.2017_01_26_23_30.0
abcd.log.2017_01_26_23_35.0
abcd.log.2017_02_20_23_10.0
xyz1.log.2017-02-01
xyz2.log.2017-03-11

abcd.log.2017_01_26_23_30.0검색하려면 다음과 같은 파일이 필요합니다 .

myRegex="[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{2}_[0-9]{2}.[0-9]{1}"
realPath="/mainFolder/test/abcd.log.2017_01_26_23_30.0"
[[ $realPath =~ $myRegex ]] && echo "It is matching" || echo "Does not match"

파일을 얻은 후에는 날짜를 특정 형식으로 추출해야 합니다 yyyy-mm-dd(이것이 바로 나에게 필요한 것입니다 2017-01-26).

어떻게 해야 하나요?

답변1

캡처 그룹을 사용하고 $BASH_REMATCH문자열 비트를 추출합니다.

for name in *.log.*; do
    if [[ "$name" =~ \.([0-9]{4})_([0-9]{2})_([0-9]{2}) ]]; then
        printf '%d-%d-%d from "%s"\n' \
            "${BASH_REMATCH[1]}" \
            "${BASH_REMATCH[2]}" \
            "${BASH_REMATCH[3]}" \
            "$name"
    fi
done

산출:

2017-01-26 from "abcd.log.2017_01_26_23_30.0"
2017-01-26 from "abcd.log.2017_01_26_23_35.0"
2017-02-20 from "abcd.log.2017_02_20_23_10.0"

변수에 날짜 문자열이 필요한 경우:

for name in *.log.*; do
    if [[ "$name" =~ \.([0-9]{4})_([0-9]{2})_([0-9]{2}) ]]; then
        datestring="$( printf '%d-%d-%d' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" )"
        printf '%s from "%s"\n' "$datestring" "$name"
    fi
done

ksh93, 로 BASH_REMATCH바꾸세요 .sh.match.

답변2

나는 perl다음과 같이 사용하고 처리합니다.

#!/usr/bin/env perl
use strict;
use warnings;

while ( <> ) {
  my ( @date ) = m/(\d{4})\D(\d{2})\D(\d{2})/;
  my $date_str = join "-", @date;
  print $date_str,"\n";
}

"4자리", "2자리", "2자리"와 일치하여 구분하여 다시 형식화합니다 -. 그러나 이는 귀하의 번호가 "올바른" 방식으로 정렬되었다고 가정합니다.

관련 정보