首先,我是新人,所以我仍在学习..
数据集文件有点像这样
101 80 10 27598 General Tao Vancouver 01:45:10 01:46:10 00:43:00 00:59:59 01:25:10
我试图检查时间以确保它们与 的格式匹配/d/d:/d/d:/d/d
,如果它与该正则表达式不匹配,则它会打印出该行的第一个数字(在本例中为 101)
我一直在 CLI 中尝试一种衬垫,但没有成功。
grep '/d/d:/d/d:/d/d' file.txt
即使这样也没有发生任何事情
edit1:在数据集中,有一些数据看起来像 01:4510 或类似的数据
我希望得到的示例输出是:
104 80 10 27598 BigBelly Vancouver 01:4510 01:46:10 00:43:00 00:59:59 01:25:10
答案1
您一定一直在考虑使用\d
regexp 运算符来perl
匹配十进制数字。但请注意,很少grep
有实现支持它。标准等效项是[[:digit:]]
.
某些grep
实现支持\d
if 传递-P
选项(使用类似 perl 的正则表达式而不是基本正则表达式)。
因此,有了这些,你可以这样做:
grep -Pv '\d\d:\d\d:\d\d' < file.txt
返回不包含与该模式匹配的字符串的行。
(请注意,它们是反斜杠不是正斜杠)
或者:
grep -Pv '(\s+\d\d:\d\d:\d\d){5}\s*$' < file.txt
对于不以 5 个这样的时间戳结尾的行。
要在这种情况下返回第一个字段,您可以这样做(使用grep
也支持的实现-o
)
grep -Po '^(?!.*(\s+\d\d:\d\d:\d\d){5}\s*$)\s*\K\S+' < file.txt
这次使用负向前看 perl 正则表达式运算符而不是使用grep
's -v
。
macOS的grep
(你说你正在使用,我现在已经删除了操作系统标记您的问题并将其替换为苹果系统) 恰好是少数几个基本正则表达式支持的人之一\d
,但它不支持-P
,因此那些(?!...)
和\K
运算符在那里不可用。
标准(且更清晰)的等效内容是:
awk '!/([[:digit:]]{2}:){2}[[:digit:]]{2}/ {print $1}' < file.txt
awk
用途扩展正则表达式这是另一种方言。请注意某些实现,包括mawk
仍然不支持{2}
间隔运算符或字符类。
在 中mawk
,你会这样做:
awk '!/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/ {print $1}' < file.txt
这也应该适用于其他awk
实现,但请注意,某些实现[0-9]
可能会匹配 0123456789 以外的字符(非 ASCII 字符,因此您的输入可能不会出现问题)。
或者再次检查最后 5 个字段是否与模式匹配:
awk '
{
for (i = 0; i < 5; i++)
if (!($(NF-i) ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/)) {
print $1
next
}
}' < file.txt