检查文件中的字符串是否与正则表达式匹配,如果不匹配则打印出该行中的第一个字符串

检查文件中的字符串是否与正则表达式匹配,如果不匹配则打印出该行中的第一个字符串

首先,我是新人,所以我仍在学习..

数据集文件有点像这样

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

您一定一直在考虑使用\dregexp 运算符来perl匹配十进制数字。但请注意,很少grep有实现支持它。标准等效项是[[:digit:]].

某些grep实现支持\dif 传递-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

相关内容