Grep多行模式


13

如何在多行中搜索短语?例如,让我们使用短语“我的冰茶”,然后将其包装在文本文件中:

as js skdfh dfh djh sf my
ice tea.

grep将不匹配,因为它们之间有换行符。我该如何搭配?另一个多行模式是pattern1_\n_pattern2

我知道我做ATM的最简单方法就是grep的一部分,例如只用-A2 -B2标志加冰,然后在输出中再加g例如茶。但这非常繁琐。因此,我对您将如何解决此问题表示怀疑。


Answers:


16

您可以安装pcregrep(在大多数发行版存储库中可用)-使用pcre库的 grep ,该执行“ Perl兼容正则表达式”。它具有一个命令行选项-M,使您可以从手册页进行多行搜索:

“任何一场比赛的输出可能包含多于一行。”

所以你可以做

pcregrep -M 'my\s+ice\s+tea' filename

\s是空白,将匹配\n\r在多模式中,除了正常的空格字符。您还可以直接匹配换行符,因此您可以

pcregrep -M 'pattern1_\n_pattern2' filename

+1好。从来没有听说过,但尝试了一下,它就像一个魅力!
DaveParillo

grep -E这样做PCRE模式?
丹妮丝

3
@Daenyth grep的-E大多只是意味着你可以使用 ?+{|(,和)作为,而不必拥有自己平时的正则表达式的含义\ 在前面,当你做,如果你使用标准的grep。所以grep 'hello\s\+world' file等于grep -E 'hello\s+world' file。它不执行PCRE。有grep -Pperl正则表达式,但是它是实验性的(根据手册页),我认为它与pcregrep有点不同...
Hamish Downer 2010年

1
是的,我在想-P什么时候说-E,但是我没有意识到这是不同的。
2010年

3

我可能会使用vim:vimgrep命令进行搜索。它的工作方式与之类似,grep但支持vim RE和路径。

基本上,您可以执行类似:vimgrep 'pattern1\npattern2' path/**的递归搜索,然后键入:copen以弹出一个包含匹配列表的较小窗口。

vimRE几乎可以完成PCRE所能做的一切,但是它们与perl正则表达式谱系是分开发展的,因此大多数高级东西的工作方式都不同。它们的基本功能更像基本RE,但它们具有PCRE无法提供的一些漂亮功能。

我不确定是否可以:vimgrepgrep这样吐出数据。我只曾尝试将其用于中的导航vim

:help vimgrep从内部vim获取更多信息;:help pattern.txt有关可vim再生能源的信息;有关路径的更多信息,请参见:help wildcards


请注意-这并不是完全可移植的,因为它在不同平台上的行为会有所不同
Daenyth 2010年

1
@Daenyth:你的意思是在不同的影响下.vimrc吗?它应该比grep操作系统更具可移植性:vim没有“ POSIX风格”,甚至在Windows下也几乎相同。................................................... ....................................可以添加限定符以确保在RE上使用例如正确数量的“魔术”。据我了解,有一个严格的不成文规则,不能单独保留该选项。
直觉

我自己没有使用过,但是显然它在Windows上使用了一个不同的后端(find.exe而不是grep)。在过去的几周内还有另一个问题。
2010年

1
@Daenyth:您在考虑:vimgrep还是:grep?来自:help grep:“内部grep [ie :vimgrep] 的优点是它可以在所有系统上运行,并使用强大的Vim搜索模式。”
直觉

1
啊,一定是这样。我把两个弄糊涂了。
2010年

2

Grep一次只能在一行上工作,但是您可以使用awk打印与一系列模式匹配的行:

cat file | awk '/foo/,/bar/'

它会匹配任何东西,而不仅仅是两个模式之间的换行符


0

要充分利用Unix,您需要利用管道。您可以grep使用管道(不需要tee)以简单的方式执行此操作:

$ grep -A1 "pattern1" file.txt |  grep "pattern2"

我不会觉得乏味。


我认为这很容易出错,因为pattern1和pattern2之间可以存在pattern3,这可能不是您想要的。因此,您必须手动控制每个匹配。
数学
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.