我需要一个shell脚本,它可以解析传入的日期值并以标准格式打印。
传入日期模式为:
"yyyyMMdd HHmmss"
"yyyyMMdd_HHmmss"
"MMddyyyy:HHmmss"
"MMddyyyyHHmmssmillisecond"
20170426 102300
20170426_102300
04262017:102300
0426201710230066
输出日期模式:
YYYYMMDD_HHMMSS 20170426_102300
知道如何在bash中实现这个结果。我尝试了几个正则表达式来获得结果,但这没有帮助。 任何帮助表示赞赏。
答案 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)}'
与perl
和sed
示例几乎相同。测试和正则表达式替换。
答案 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