다음 위치에 일부 파일이 있습니다 /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자리"와 일치하여 구분하여 다시 형식화합니다 -
. 그러나 이는 귀하의 번호가 "올바른" 방식으로 정렬되었다고 가정합니다.