如何在以时间戳开头的行之后添加空行

如何在以时间戳开头的行之后添加空行

我现在的公司日志查看体验太差了。我想在特定时间段内修剪的日志中添加新行。我想在每个约会时间后换一条新线。

日期时间格式是这样的。

2023-10-03 15:34:37

我知道tr可以做到这一点,但我不确定如何做到。我会选择最好的答案,任何人都可以告诉我如何将新内容写入新文件。因为性能原因。我不喜欢使用 vi,我较少使用它作为日志阅读器。

答案1

在 中vim,你可以这样做:

:%s/\v^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}.*/&\r

注意\v对于非常神奇所以你不需要在每个之前添加反斜杠{}()

是的,\r在替换中添加换行符 (将线分成两部分使用 ) 处的措辞:help s/\r,而不是人们所期望的回车符。

标准vi\d, \v, \rnorm都是vim扩展名),等价的看起来像:

:%s/^[[:digit:]]\{4\}\(-[[:digit:]]\{2\}\)\{2\} [[:digit:]]\{2\}\(:[[:digit:]]\{2\}\)\{2\}.*/&^M/

^M通过按Ctrl+V后输入Enter(并再次插入 LF 又名换行符 aka ^J,而不是 CR 又名回车符 aka ^M)。

viCentOS 上的实现是vim(并且至少早在 CentOS 4 就已经实现了),因此您应该能够依赖其中的vim扩展vi

无论如何tr是一个音译、用其他字符替换字符或者删除或挤压它们的工具,它不能在这里使用。

sedawk或者perl可以使用(AFAIK,\d作为源自 perl 的正则表达式运算符):

perl -pi -e '$_ .= "\n" if /^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}/' your-file

编辑文件in处。或者:

perl -p -e '$_ .= "\n" if /^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}/' < your-file > new-file

将结果放入新文件中。

或者在这里,假设该Regex::Common::time模块可用:

perl -MRegexp::Common=time -p -e '
  $_ .= "\n" if m{^$RE{time}{strftime}{-pat=>"%Y-%m-%d %H:%M:%S"}}
  ' < your-file > new-file

2023-13-00 25:61:62这将进行更严格的匹配(例如不匹配)。还有一个$RE{time}{iso}将匹配这些日期,但也有 ISO8601 日期的许多其他变体,包括一些没有日期或时间组件的变体,因此不能在此处使用。

您可以使用以下命令查看实际的正则表达式:

$ perl -MRegexp::Common=time -le 'print $RE{time}{strftime}{-pat=>"%Y-%m-%d %H:%M:%S"}'
(?:(?:\d{4})-(?:(?:(?=[01])(?:0[1-9]|1[012])))-(?:(?:(?=[0123])(?:0[1-9]|[12]\d|3[01]))) (?:(?:(?=[012])(?:[01]\d|2[0123]))):(?:(?:[0-5]\d)):(?:(?:(?=[0-6])(?:[0-5]\d|6[01]))))

答案2

这个命令:

:并输入 g/\v\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/normal o

解释:

  • g:全局的缩写,在与正则表达式匹配的所有行上执行命令
  • \v:制作正则表达式“非常神奇”(它的真实名称)。意味着你不必转义特殊字符
  • /^\d\{4\}-\d\{2\}-\d\{2\} \d\{2\}:\d\{2\}:\d\{2\}/: 是正则表达式。将其放入类似的工具中https://regexr.com/或者https://regex101.com/,他们解释得很好
  • normal o:普通命令执行参数正常模式。在这种情况下,按下它o会打开一个新行


阅读官方文档的解释: :help global , :help \v,:help normal

相关内容