2016-04-12 76 views
0

我想从文件中抽取所有不包含特定模式的行。Bash - 从不包含特定模式的文件中获取行

pattern="tmp/[...]/include/linux/*.h" 
file contains: 
17937;/home/[...]/tmp/[...]/include/linux/header.h;484;16;[Other text here] 
37417;/home/[...]/tmp/[...]/src/file.cpp;1851;41;[Other text here] 
17945;/home/[...]/tmp/[...]/include/linux/*/header.h;484;16;[Other text here] 

预期结果只是第二行。

我已经试过波纹线和我得到的文件的全部内容:

grep -E -v $pattern file 

它只能与波纹管线,但它是不够的:

grep -E -v .h file 

如何我可以获得所需的输出吗?

+2

grep -E -v“tmp /\\​​[...\\]/include/linux/.*.h”将根据您的数据得到想要的结果。 – sigmalha

+0

如果确定排除的行的模式是固定的,或者就像使用通配符,那么我不清楚:* .h - >排除扩展名为.h的所有文件。 – MarcM

+0

这就像使用通配符。所有具有该模式的行被排除(所有.h行与相同的位置) –

回答

1

你的正则表达式需要成为"tmp/\[\.\.\.]/include/linux/.*\.h"

  • 第一方括号需要进行转义,因为有[]手段“匹配的人物之一”之间的字符的列表。
  • 通配符与前面的字符相关联,因此您需要在之前放一个点来匹配任何字符。
  • 如果你想匹配它们,你需要避开点,否则它们将匹配任何字符(它会在你的情况下工作)。
+1

逃离第一个方括号也很重要。请参阅POSIX注册表手册页中'括号表达式'一节:'man re_format'。 –

+0

对,我忘了强调这一点,谢谢。 – Sylvain

相关问题