【发布时间】:2014-01-07 09:30:48
【问题描述】:
我有一个问题,我需要在许多文件中识别每个问题的出现。出现次数是根据跨多行的模式确定的。
在我的例子中,我试图识别具有前导空格、包含多个连续空格字符或前面有一组已知小词(例如“或”、“和”等)的文字。文字由单引号决定。但是,我只对其中四行包含“LITERAL”一词的文字感兴趣。
以下是文件内容的一些示例:
EXEC LITERAL
LEVEL
NAME
LENGTH
VALUE (' Foo')
END EXEC
EXEC LITERAL
LEVEL
NAME
VALUE ('Foo Bar')
END EXEC
EXEC LITERAL
LEVEL
NAME
VALUE ('Bar Foo')
END EXEC
EXEC LITERAL
LEVEL
NAME
VALUE ('Foo')
END EXEC
EXEC LITERAL
LEVEL
NAME
LENGTH
VALUE ('or Bar')
END EXEC
EXEC DEFINITION
LEVEL
NAME
LENGTH
VALUE ('Bar')
END EXEC
在上面的示例中,我希望输出识别文件并列出 'Foo'、'Foo Bar' 和 'or Bar' 的出现。请注意,“Bar Foo”不包括在内,因为如果引号中用于分隔单词的任何空格是单个空格,则可以接受。
我已经能够构建 grep 语句,允许我识别多个空格、前导空格和包含一个小单词(通过多个管道)的实例,但是我似乎无法将 grep 用于正则表达式。我在另一篇文章中看到过使用pcregrep 来支持grep 中的正则表达式。我很高兴这样做,但我对使用的正则表达式有点迷茫。
到目前为止,我已经得到了以下命令:
pcregrep -M 'LITERAL.*\n.*\n.*\n.*\n.*VALUE.* ' test.txt
不幸的是,它没有选择“Foo Bar”示例(因为我认为是 4 x \n)。下一个拿起'Foo Bar'但没有拿起'or Bar':
pcregrep -M 'LITERAL.*\n.*\n.*\n.*\n.*VALUE.* ' test.txt
此外,当我使用更大的数据集进行测试时,它会在不符合上述模式时选择 LITERAL(例如,它是与上述无关的另一个词的一部分)。我真的需要表达式来限制对给定模式的匹配,忽略不构成上述示例模式的 VALUE 或 LITERAL 实例。
欢迎任何有关如何解决此问题的帮助。
【问题讨论】: