根据字符串中的位置用字母替换字符

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)

Sté*_*las 5

听起来好像

< 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)