我需要一些帮助或建议awk
以及它对正则表达式的使用。我有一个结构不规则的数据输入文件。要正确解析此文件,我需要识别以下形式的一行:
@ 8/1/17, 10:04 PM
具有这种模式的线标志着一个完整事务的结束。它只是一个日期和时间戳,前面有一个空格和@
字符。
我拼凑了一个似乎在“大多数”用法中匹配的正则表达式:
\W\@\W[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,2}\,\W[0-9]{1,2}\:[0-9]{2}\W[AP]M
awk
但是,在以下语句中使用时,它似乎不匹配:
$ awk 'match($0, /\W\@\W[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,2}\,\W[0-9]{1,2}\:[0-9]{2}\W[AP]M/) {print $0}' testfile2.txt
我的系统 ( macos mojave ) 有一个旧版本的awk
awk version 20070501
.
我还发现:
grep -e
无法将此模式与 中的任何行匹配testfile2.txt
,但确实egrep
与grep -E
我期望它们匹配的行匹配。awk 'match($0, /\@/) {print $0}' testfile2.txt
确实匹配(并打印)预期的行,但我不能依赖单个字符!
这是testfile2.txt:
+13054261988:将数据转发到主存储库
@ 1/7/18,下午 4:21
+16744774911:使用此 URL:https
: //www.repo-prime.ga/ @ 1/7/18,下午 4:22
+ 13054261988:会的。密码好吗?
@ 1/7/18,下午 6:12
+16744774911:不,对所有交易使用 2FA
@ 1/7/18,晚上 8:56
+13054261988:使用 Google 的身份验证器?如果是这样,将需要更多信息。
@ 1/7/18,晚上 9:36
+13054261988:尽快回复,我有交易需要上传。
@ 2018 年 1 月 7 日,晚上 9 点 46 分
我的正则表达式是否awk
由于我在语句中看不到的错误而无法匹配使用awk
,或者是由于正则表达式本身,两者的组合等等?
/\W
(非单词字符)@
?如您的文本文件@
位于行首\@
,\,
,:
(它们不是特殊字符)match()
如果只需要匹配一个模式,调用是多余的似乎非常旧版本的 awk 没有
{…}
能力。这个旧的正则表达式语法应该在任何 awk 中匹配:
如果您的 awk 可以匹配括号表达式,如
[[:blank:]]
,则可以使正则表达式更加灵活:如果匹配一个(或多个)数字就足够了(我不明白为什么不这样做),您可以使用较短的正则表达式:
如果需要,您可以添加 start
^
和 end$
以使正则表达式更具限制性。我不使用
match
这样简单的线匹配,但相同的正则表达式可以与该函数完美配合。