时间戳和对应行的正则表达式

时间戳和对应行的正则表达式

dd-mm-yyyy我有一个人工编写的文本文件,其中包含、HH:MM或形式的时间戳HH:MM:SS。我已设法使用正则表达式从文本文件中提取时间戳,但我还想获得一行相应的时间戳。如果一个文件中有时间戳,另一个文件中有相应的行,那就太好了。每行可能有多个时间戳,因此同一行应该出现多次。

如果可以做到这一点,如果我只想要时间戳周围的几个单词或几行怎么办?想法只是获取时间戳并提取其上下文。

目前我一直使用 Matlab 来完成此任务,但 MacOS 支持的任何 Unix 工具适用于 Windows 的便携式 git bash。 Macgrep不支持-PPerl 正则表达式选项,而环顾四周需要该选项(?<![0-9])

以下是原始文件和所需输出的示例:

原来的:

L&L logfile

14-5-12
16-05-2012
Experiment 1
Device 77212-123-123123
Instrument 2, 34g, 66hz
Notes:
Something weird happened 12:34
Everything is fine 13:07
Log
8:00 routine 1
8:20 routine 2
8:40 routine 3, 8:45 something went south
8:50 routine 4, 8:50:12 weird peak at data

输出1:

14-5-12
16-05-2012
12:34
13:07
8:00
8:20
8:40
8:45
8:50
8:50:12

输出2:

14-5-12
16-05-2012
Something weird happened 12:34
Everything is fine 13:07
8:00 routine 1
8:20 routine 2
8:40 routine 3, 8:45 something went south
8:40 routine 3, 8:45 something went south
8:50 routine 4, 8:50:12 weird peak at data
8:50 routine 4, 8:50:12 weird peak at data

答案1

grep -Eo '[0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?' text.file

将只产生时间戳。通过删除-o选项,您将收到完整的行

grep -E '[0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?' text.file

如果模式[0-9.]{10}不能产生正确的输出,则可以很容易地更改为更强大的输出,([0-9]{2}\.){2}[0-9]{4}
如果您想同时执行这两项任务,可以通过以下方式完成sed例如

sed -r '/[0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?/w string.file
s/[^:]*([0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?)/\1\n/;//P;D' text.file

相关内容