GNU正则表达式:检查C10或Z12的每一行

时间:2016-04-14 14:12:33

标签: regex

我有一个包含多行的文件。每行以 C10 Z12 开头。

如果有一行没有以 C10 Z12 开头(如第3行中的示例所示),我想用gnu regex检查整个文件。 / p>

C10     USE/0712015/004     831252      00248235    EUR 20071205             42.25  12137377-40-5                           USE/071205/004      Mika Muuu
Z12     USE/0712015/018     831252      01087484    EUR 20071405            400.00  8782400                             USE/071205/018      Bada Bing
        USE/0712015/021     831352      01017484    EUR 20271205            410.00  8782400-10-5                           USE/071405/017   Bubu
Z12     USE/0712015/091     131252      01087484    EUR 20171205            540.00  8782400-1                               USE/071205/018      Foo
C10     USE/0712015/008     232252      00248235    EUR 30071205             42.25  12137377-40-5                           USE/071205/004      Boo

谢谢你的帮助!

3 个答案:

答案 0 :(得分:3)

您需要匹配以C10或Z12开头的行:

  • C10将匹配C10
  • Z12将匹配Z12
  • ^将匹配行的开头
  • ^C10将匹配行开头的C10
  • (C10|Z12)将匹配C10或Z12
  • ^(C10|Z12)将匹配行开头的C10或Z12

现在我们可以使用grep来恢复此匹配:grep -vE '^(C10|Z12)' file将返回不以C10或Z12开头的行。

如果您没有grep或其他可以反转正则表达式结果的工具,您仍然可以通过以下几个步骤执行此操作:

  • (?!pattern)是一种否定的预测:仅当模式不是
  • 时才匹配
  • (?!C10|Z12)匹配任何不是C10和Z12
  • 的地方
  • ^(?!C10|Z12)匹配不以C10或Z12
  • 开头的行的开头
  • ^(?!C10|Z12).*匹配不以C10或Z12
  • 开头的实线

答案 1 :(得分:1)

使用PERL(NULL)的扩展支持,在两个grep中执行此操作将更容易(也更容易理解)。您必须使用-P选项,因为普通-P不支持否定前瞻。

此外,无论您发现使用否定前瞻,请将其保留在单引号内,而不是双引号,否则会出现grep错误

bash

您也可以单grep -P '^(?!Z12)' input_file | grep -P '^(?!C10)' 作为

执行此操作
grep

答案 2 :(得分:0)

以下是一些负面预测的替代方案。在这些中,我假设一个名为input的文件包含您的数据。

  • 使用grep -v进行连续过滤:

    grep -v '^C10' input | grep -v '^Z12'

  • 以所有空格开头的行:

    grep '^ *USE' input

  • 使用awk:

    awk '!/^(C10|Z12)/' input