我需要一个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)}'
与perl
和sed
示例几乎相同。测试和发条更换。
首先以格式制作所有日期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