dd-mm-yyyy
我有一个人工编写的文本文件,其中包含、HH:MM
或形式的时间戳HH:MM:SS
。我已设法使用正则表达式从文本文件中提取时间戳,但我还想获得一行相应的时间戳。如果一个文件中有时间戳,另一个文件中有相应的行,那就太好了。每行可能有多个时间戳,因此同一行应该出现多次。
如果可以做到这一点,如果我只想要时间戳周围的几个单词或几行怎么办?想法只是获取时间戳并提取其上下文。
目前我一直使用 Matlab 来完成此任务,但 MacOS 支持的任何 Unix 工具和适用于 Windows 的便携式 git bash。 Macgrep
不支持-P
Perl 正则表达式选项,而环顾四周需要该选项(?<![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