Shell脚本用于解析传入日期并以标准格式打印

时间:2017-04-27 17:02:05

标签: bash shell

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

传入日期模式为:

    "yyyyMMdd HHmmss"
    "yyyyMMdd_HHmmss"
    "MMddyyyy:HHmmss"
    "MMddyyyyHHmmssmillisecond"

     20170426 102300
     20170426_102300
     04262017:102300
     0426201710230066

输出日期模式:

YYYYMMDD_HHMMSS 20170426_102300

知道如何在bash中实现这个结果。我尝试了几个正则表达式来获得结果,但这没有帮助。 任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:1)

perl是否可以接受?

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";
    }
}

Havn虽然测试了它......

您也可以像这样使用它:

~$ 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_$2\n";
    } elsif ($_ =~ m/(\d{4})(\d{4}):(\d{6})/) {
        print "$2$1_$3\n";
    } elsif ($_ =~ m/(\d{4})(\d{4})(\d{6})\d*/) {
        print "$2$1_$3\n";
    } else { print "$_ does not fit\n"; }
}' "${testdata[@]}"

如果您没有生产环境中的perl,那么您可能希望找到sed解决方案。 我建议来自Walter A的那个:

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

答案 1 :(得分:1)

将输入传输到 sed

sed -re 's/([0-9]{8}) ([0-9]{6})/\1_\2/' -e 's/([0-9]{4})([0-9]{4}):?([0-9]{6}).*/\2\1_\3/'

答案 2 :(得分:0)

为了好玩,以下是使用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示例几乎相同。测试和正则表达式替换。

答案 3 :(得分:0)

首先以yyyyMMdd

格式制作所有日期
sed -r 's/([0-9]{4})([0-9]{4})([0-9:])/\2\1\3/'

接下来删除日期和小时之间的可选字符

sed -r 's/([0-9]{4})([0-9]{4})([0-9:])/\2\1\3/; s/[ _:]//'

更改yyyyMMddHHmmss ??成为所需的格式

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

编辑: 我首先尝试显示msec,但不需要那些:

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