重新排序块字符串

时间:2018-02-06 08:47:42

标签: linux bash sed

我在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'

但它是伪的,不是真正的解决方案(最后它看起来非常糟糕)。如何捕获字符串的块并在之后重新排序?

4 个答案:

答案 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

请参阅substrsub的文档。

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,即可完成工作。那些字段是固定宽度的。