如何在多行中搜索短语?例如,假设有短语“my ice tea”,那么它可能被包装在文本文件中:
as js skdfh dfh djh sf my
ice tea.
grep 不会匹配,因为中间有一个换行符。我该如何匹配它们?另一个多行模式是pattern1_\n_pattern2
我知道执行 ATM 的最简单方法是只 grep 一部分,例如,只使用 -A2 -B2 标志的 ice,然后在该输出中再次查找,例如 tea。但这非常繁琐。所以我很想知道你会如何解决这个问题。
答案1
答案2
vim
我可能会使用的命令进行搜索:vimgrep
。它的工作方式与 有点相似,grep
但支持 vim RE 和路径。
基本上,您运行类似:vimgrep 'pattern1\npattern2' path/**
递归搜索的程序,然后键入:copen
以调出一个包含匹配列表的小窗口。
vim
RE 几乎可以完成 PCRE 能做的所有事情,但它们是独立于 perl 正则表达式谱系发展而来的,因此大多数高级功能的工作方式都不同。它们的基本功能更像基本 RE,但它们具有 PCRE 所不具备的一些巧妙的附加功能。
我不确定是否有可能像它:vimgrep
那样输出数据grep
;我只尝试过使用它进行内部导航vim
。
:help vimgrep
从内部vim
获取更多信息;:help pattern.txt
有关vim
RE 的信息;有关路径的更多信息请参阅: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
模式。