1

我有带行的访问日志

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 用逗号分隔日期和时间

4

3 回答 3

2

好像你想要这样的东西,

$ 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 位数字捕获到一个组中。
于 2014-11-12T09:19:57.160 回答
1

这要简单得多 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.

使用分隔文件,将字段中的,第一个空格替换为3rd,

于 2014-11-12T09:37:10.820 回答
0

在复杂的 sed中有点安全

sed 's/\(,[-0-9]\{10\}\) *\([0-9:]\{8\},\)/\1,\2/g' YourFile

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

sed 's/  */,/' YourFile

但在这两种情况下(如之前的回复帖子),它假定文件中只有与示例类似的行。如果没有,您必须提供其他可能的文件(作为 http 日志,任何错误都可能发生,如错误的 URL 消息, ... )

于 2014-11-12T10:11:46.093 回答