文字列内の位置に応じて文字を文字に置き換えます。

文字列内の位置に応じて文字を文字に置き換えます。

私は次のような結果を得ました。

(2+05:10)
(10:19)
(00:45)

この出力は1日の時間と分を表します。これを得るために、「:」をそれぞれ「d」、「h」、「m」に置き換えたいと思います。

2d05h10m
10h19m
00h45m

現在私が試した結果、

 sed -e 's/(//g; s/)//g; s/+/:/g'|awk '{split($0,s,":"); print s[1]"d" s[2]"h"s[3]"m"}')

これは提供されます(私はここで壊れています!)

6d05h20m
3d15h17m
1d02h27m
00d08hm
00d11hm
02d25hm
02d30hm
16d50hm
5d00h39m
21d48hm

ベストアンサー1

〜のように聞こえる

< file tr '+:)' dhm | tr -d '('

そうするでしょう。または、パターンをより明示的に一致させます。

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

一部のsed実装では、拡張正規表現を使用して単純化できます。

sed -E 's/\(([0-9]+)\+([0-9]+):([0-9]+)\)/\1d\2h\3m/g
        s/\(([0-9]+):([0-9]+)\)/\1h\2m/g' < file

または単一のsコマンドを使用してくださいperl

perl -pe 's{\((?:(\d+)\+)?(\d+):(\d+)\)}{
    ($1 && "$1d") . "$2h$3m"}ge' < file

または:

perl -pe 's/\((\d*\+?\d+:\d+\))/$1 =~ y|+:)|dhm|r/ge' < file

おすすめ記事