Grep 多行模式

mat*_*ath 14 grep regex newlines

如何在多行中搜索短语?例如,让短语“我的冰茶”,然后它可以包含在文本文件中:

as js skdfh dfh djh sf my
ice tea.
Run Code Online (Sandbox Code Playgroud)

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

我知道我做 ATM 的最简单的方法是只对一部分进行 grep,例如用 -A2 -B2 标志加冰,然后在该输出中再次输入例如茶。但这非常乏味。所以我对你如何解决这个问题很感兴趣。

Ham*_*ner 17

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

“任何一场比赛的输出都可能包含不止一行。”

所以你可以这样做

pcregrep -M 'my\s+ice\s+tea' filename
Run Code Online (Sandbox Code Playgroud)

\s是空白,将匹配\n\r在多模式中,除了正常的空格字符。你也可以直接匹配换行符,所以你可以这样做

pcregrep -M 'pattern1_\n_pattern2' filename
Run Code Online (Sandbox Code Playgroud)

  • @Daenyth grep -E 主要只是意味着您可以使用`?`、`+`、`{`、`|`、`(` 和`)` 作为它们通常的正则表达式含义,而不必在前面有`\ ` ,就像使用标准 grep 时所做的那样。所以`grep 'hello\s\+world' file` 等价于`grep -E 'hello\s+world' file`。它不做 PCRE。perl 正则表达式有 `grep -P`,但它是实验性的(根据手册页),我认为它与 pcregrep 有点不同...... (4认同)