我在以下位置有一些文件/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 位数字”,并重新格式化它们以进行-
分隔。但它假设您的数字以“正确”的方式排序。