从“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 位数字”,并重新格式化它们以进行-分隔。但它假设您的数字以“正确”的方式排序。

相关内容