Grep 多行模式

Grep 多行模式

如何在多行中搜索短语?例如,假设有短语“my ice tea”,那么它可能被包装在文本文件中:

as js skdfh dfh djh sf my
ice tea.

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

我知道执行 ATM 的最简单方法是只 grep 一部分,例如,只使用 -A2 -B2 标志的 ice,然后在该输出中再次查找,例如 tea。但这非常繁琐。所以我很想知道你会如何解决这个问题。

答案1

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

“任何一个匹配的输出可能包含多行。”

所以你可以

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

\s空格,除了正常的空格字符外,它还会在多行模式下匹配\n\r。您还可以直接匹配换行符,因此您可以这样做

pcregrep -M 'pattern1_\n_pattern2' filename

答案2

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

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

vimRE 几乎可以完成 PCRE 能做的所有事情,但它们是独立于 perl 正则表达式谱系发展而来的,因此大多数高级功能的工作方式都不同。它们的基本功能更像基本 RE,但它们具有 PCRE 所不具备的一些巧妙的附加功能。

我不确定是否有可能像它:vimgrep那样输出数据grep;我只尝试过使用它进行内部导航vim

:help vimgrep从内部vim获取更多信息;:help pattern.txt有关vimRE 的信息;有关路径的更多信息请参阅:help wildcards

答案3

Grep 每次只能处理一行,但你可以使用 awk 打印与一系列模式匹配的行:

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

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

答案4

我相信下面的方法应该可以工作,并且具有仅使用扩展正则表达式的优点,而无需安装额外的工具,例如pcregrep如果您还没有它或没有-P可用的 grep 选项(例如 macOS):

egrep -irzo “.*aaa(.*\s.*){1,}.*bbb.*" path_to_filenames

买者自慎:这确实有一些轻微的缺点:

  • 它将在每个文件中找到从第一行aaa到最后一行最多的行,除非......bbb
  • 有几次重复的aaa[东西]bbb模式。

相关内容