外壳脚本以解析传入日期并以标准格式打印



我需要一个shells脚本,该脚本可以解析传入的日期值并以标准格式打印。

传入的日期模式为:

    "yyyyMMdd HHmmss"
    "yyyyMMdd_HHmmss"
    "MMddyyyy:HHmmss"
    "MMddyyyyHHmmssmillisecond"
     20170426 102300
     20170426_102300
     04262017:102300
     0426201710230066

输出日期模式:

yyyymmdd_hhmmss20170426_102300

任何想法如何实现这一结果。我尝试了几条正则结果,但这无济于事。任何帮助都将不胜感激。

将输入输入到 sed

sed -re 's/([0-9]{8}) ([0-9]{6})/1_2/' -e 's/([0-9]{4})([0-9]{4}):?([0-9]{6}).*/21_3/'

可以接受吗?

while (<>) {
    if ($_ =~ m/(d{8})[ _](d{6})/) {
        print "$1_$2";
    } elsif ($_ =~ m/(d{4})(d{4}):(d{6})/) {
        print "$2$1_$3";
    } elsif ($_ =~ m/(d{4})(d{4})(d{6})d*/) {
        print "$2$1_$3";
    }
}

虽然没有测试...

您也可以这样使用:

~$ cat data | perl -e 'while (<>) {
    if ($_ =~ m/(d{8})[ _](d{6})/) {
        print "$1_$2";
    } elsif ($_ =~ m/(d{4})(d{4}):(d{6})/) {
        print "$2$1_$3";
    } elsif ($_ =~ m/(d{4})(d{4})(d{6})d*/) {
        print "$2$1_$3";
    }
}'

对于您的数组,这可能是可以接受的:

~$ perl -e 'for (@ARGV) {
    if ($_ =~ m/(d{8})[ _](d{6})/) {
        print "$1_$2n";
    } elsif ($_ =~ m/(d{4})(d{4}):(d{6})/) {
        print "$2$1_$3n";
    } elsif ($_ =~ m/(d{4})(d{4})(d{6})d*/) {
        print "$2$1_$3n";
    } else { print "$_ does not fitn"; }
}' "${testdata[@]}"

如果您的生产环境中没有Perl,则可能想解决sed解决方案。我建议来自Walter A的人:

for t in "${testdata[@]}"; do 
    echo $t |  sed -re 's/([0-9]{4})([0-9]{4})([0-9:])/213/; s/[ _:]//;s/(.{8})(.{6}).*/1_2/'; 
done

为了娱乐,这是一种使用awk

的解决方案
awk 'NF==2{print $1"_"$2} $1~"_"{print $1} $1~":"{print gensub(/([0-9]{4})([0-9]{4}):([0-9]{6})/, "\2\1_\3", "g", $1)} length($1)==16{print gensub(/([0-9]{4})([0-9]{4})([0-9]{6}).*/, "\2\1_\3", "g", $1)}'

perlsed示例几乎相同。测试和发条更换。

首先以格式制作所有日期yyyymmdd

sed -r 's/([0-9]{4})([0-9]{4})([0-9:])/213/'

接下来删除白天和小时之间的可选字符

sed -r 's/([0-9]{4})([0-9]{4})([0-9:])/213/; s/[ _:]//'

更改yyyymmddhhmmss?进入所需格式

sed -r 's/([0-9]{4})([0-9]{4})([0-9:])/213/; s/[ _:]//;s/(.{8})(.{6}).*/1_2/' 

编辑:我首先试图显示MSEC,但不需要这些:

# INCORRECT SOLUTION
# sed -r 's/([0-9]{4})([0-9]{4})([0-9:])/213/; s/[ _:]//; s/$/00/' | cut -c1-16

最新更新