「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桁」と一致して区切り、再フォーマットします-。ただし、これはあなたの番号が「正しい」方法でソートされていると仮定します。

関連情報