我在Windows的日志中有一个字符串
InstallDate=20171026224422.000000+300
如何使用sed从此字符串中提取日期和时间并将其表示为人类可读格式?我的意思是10/26/2017 22:44:22
我对日期解决方案的看法(伪):
sed -nr 's/.*=([0-9]{1,4})([0-9]{1,2})([0-9]{1,2}).*/\2/\\1/\\3/p'
但它是伪的,不是真正的解决方案(最后它看起来非常糟糕)。如何捕获字符串的块并在之后重新排序?
答案 0 :(得分:0)
你的sed命令中存在一些问题,以下应该有效:
sed -nr 's/.*InstallDate=([0-9]{4})([0-9]{2})([0-9]{2}).*/\2\/\3\/\1/p' <input.txt
或时间
sed -nr 's/.*InstallDate=([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2}).*/\2\/\3\/\1 \4:\5:\6/p' <input.txt
/
转义为正则表达式分隔符(请注意,其他分隔符也可用于s,,,
或s@@@
等。)\
(\1
,而不是\\1
)转发反向引用.*
以使正则表达式匹配整行删除所有其他字符答案 1 :(得分:0)
它不一定是解谜比赛。使用awk!
$ cat r.sh
awk '
/InstallDate/ {
sub(/InstallDate=/, "")
sub(/\..*/, "")
ya = nxt(4); mo = nxt(2); da = nxt(2)
ho = nxt(2); mi = nxt(2); se = nxt(2)
printf "%s/%s/%s %s:%s:%s\n", mo, da, ya, ho, mi, se
}
function nxt(i, s) { s = substr($0, 1, i); $0 = substr($0, i + 1); return s}
'
用法
$ echo InstallDate=20171026224422.000000+300 | sh r.sh
10/26/2017 22:44:22
请参阅substr
和sub
的文档。
http://pubs.opengroup.org/onlinepubs/009695399/utilities/awk.html
答案 2 :(得分:0)
我发现用sed
做更多漂亮的方法sed -nr "s|.*=(.{4})(..)(..)(..)(..)(..)(..).*|\2/\3/\1 \4:\5:\6|p"
答案 3 :(得分:-1)
删除所有sed
说明符后,您的1,
即可完成工作。那些字段是固定宽度的。