【问题标题】:Format timestamp output using sed使用 sed 格式化时间戳输出
【发布时间】:2016-09-29 01:17:58
【问题描述】:

我是 Linux 新手,我想使用 sed 命令更改日志文件的格式:

当前格式:

2016-09-27file.txt::2016-09-27 18:00:00

预期格式:

2016-09-27file.txt::2016/09/27-18:00:00

sed命令应该怎么写?

谢谢, Z

【问题讨论】:

  • 这是一个严重混乱的日志文件格式,:s 既分隔字段又在字段内使用,并且指定了两次日期。你能从源头上解决这个问题吗?

标签: linux sed timestamp


【解决方案1】:

下面展示了如何在一行中完成:

echo "2016-09-27file.txt::2016-09-27 18:00:00" | sed 's/\([0-9]*\)-\([0-9]*\)-\([0-9]*\) /\1\/\2\/\3-/'

regexp 部分匹配您要替换的日期部分,该部分也被拆分为子表达式以使这些部分可在替换部分上引用。

【讨论】:

    【解决方案2】:
    sed -i 's/-///g' "$filename"
    
    sed -i 's/ /-/g' "$filename"
    

    试试这个。

    【讨论】:

    • 需要使用不同的分隔符,如s|-|/|g 或转义它,如s/-/\//g .. 替代解决方案的好想法,但是,这也会将开始的日期更改为字符串,这不是 OP请求...
    • 是的,你是对的,我忘记了第一次约会。我的错。
    【解决方案3】:

    这是perl 版本

    $ echo '2016-09-27file.txt::2016-09-27 18:00:00' | perl -pe 's#::\K(\d{4})-(\d{2})-(\d{2}) #$1/$2/$3-#'
    2016-09-27file.txt::2016/09/27-18:00:00
    
    • ::\K 正面向后看,检查:: 是否存在,不会被替换
    • (\d{4})-(\d{2})-(\d{2}) 捕获日期
    • $1/$2/$3- 重新格式化,$1 对应捕获组 (\d{4}) 等其他人
    • # 比平常使用的分隔符 / 无需在替换字符串中转义 /

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 2013-01-08
      相关资源
      最近更新 更多