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