Sed 用逗号分隔日期和时间

Sed 用逗号分隔日期和时间,sed,access-log,Sed,Access Log,我有一个带有行的访问日志 http://***.com ,**.**.**.**,2013-06-07 12:03:58 ,Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0. 我需要使用sed将日期和时间用逗号分隔 $ sed 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\) \([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\)/\1,\2/g'

我有一个带有行的访问日志

http://***.com ,**.**.**.**,2013-06-07 12:03:58 ,Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0. 

我需要使用sed将日期和时间用逗号分隔

$ sed 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\) \([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\)/\1,\2/g' file
http://***.com ,**.**.**.**,2013-06-07,12:03:58 ,Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0. 
  • \([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)
    捕获日期字符串
  • 匹配中间空格字符
  • \([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\)
    捕获时间字符串
  • 然后将匹配的字符串替换为组索引1中的
    \1
    字符、
    、组索引2中的
    \2
    字符
  • \(\)
    在基本正则表达式中调用了捕获组。例如,
    \([0-9]\{4\}\)
    将4位数字捕获到一个组中
      使用
      awk

      awk -F, '{sub(/ /,",",$3)}1' OFS=, file
      http://***.com ,**.**.**.**,2013-06-07,12:03:58 ,Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0.
      
      使用
      分隔文件,将
      第三个
      字段中的第一个空格替换为

      在复杂的sed中稍微安全一点

      在非常复杂的sed和简单的awk中有点容易


      但在这两种情况下(正如前面的回复文章),它都假定文件中只有一行与示例类似的内容。如果没有,您必须给出另一个可能的文件(作为http日志,任何错误都可能发生,如错误的URL消息等)

      (他只提到了“使用sed”,但仍然是+1)@NeronLeVelu感谢+1。这也是为什么我写了
      ,用awk做这件事要简单得多。
      :)
      sed 's/\(,[-0-9]\{10\}\) *\([0-9:]\{8\},\)/\1,\2/g' YourFile
      
      sed 's/  */,/' YourFile