ank*_*540 2 bash string text-processing timestamps
我有这样的输出:
(2+05:10)
(10:19)
(00:45)
Run Code Online (Sandbox Code Playgroud)
此输出表示一天的小时和分钟。我想分别用 'd'、'h' 和 'm' 替换 ':' 以获得这个
2d05h10m
10h19m
00h45m
Run Code Online (Sandbox Code Playgroud)
目前,我试过,
sed -e 's/(//g; s/)//g; s/+/:/g'|awk '{split($0,s,":"); print s[1]"d" s[2]"h"s[3]"m"}')
Run Code Online (Sandbox Code Playgroud)
这给了(在这里我搞砸了!)
6d05h20m
3d15h17m
1d02h27m
00d08hm
00d11hm
02d25hm
02d30hm
16d50hm
5d00h39m
21d48hm
Run Code Online (Sandbox Code Playgroud)
听起来好像
< file tr '+:)' dhm | tr -d '('
Run Code Online (Sandbox Code Playgroud)
会做的。或者更明确地匹配该模式:
sed 's/(\([0-9]\{1,\}\)+\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1d\2h\3m/g
s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1h\2m/g' < file
Run Code Online (Sandbox Code Playgroud)
通过一些sed实现,您可以使用扩展的正则表达式来简化:
sed -E 's/\(([0-9]+)\+([0-9]+):([0-9]+)\)/\1d\2h\3m/g
s/\(([0-9]+):([0-9]+)\)/\1h\2m/g' < file
Run Code Online (Sandbox Code Playgroud)
或者使用单个s命令perl:
perl -pe 's{\((?:(\d+)\+)?(\d+):(\d+)\)}{
($1 && "$1d") . "$2h$3m"}ge' < file
Run Code Online (Sandbox Code Playgroud)
或者:
perl -pe 's/\((\d*\+?\d+:\d+\))/$1 =~ y|+:)|dhm|r/ge' < file
Run Code Online (Sandbox Code Playgroud)