我有一个包含多行的文件。每行以 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
谢谢你的帮助!
答案 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