从文件 2 中 grep 确切的行块(文件 1 的内容)

sac*_*hin 9 sed awk shell-script text-processing

我有两个文件,file1file2.

样本内容file1为:

A B
C D
E F
G H
Run Code Online (Sandbox Code Playgroud)

内容file2如下:

A B
few other lines
E F
few more other lines
A B
C D
E F
G H
few more other lines
G H
Run Code Online (Sandbox Code Playgroud)

所以我只想搜索整个file1内容块file2。这意味着输出应仅包含以下行:

A B
C D
E F
G H
Run Code Online (Sandbox Code Playgroud)

请注意:- 只有组合在一起的行才应该是输出的一部分。

Byt*_*der 11

grep当涉及到多行模式时是非常愚蠢的,但是在比较它们之前将\n模式和文本的所有换行符翻译成 NUL 字符\0可以解决这个问题。显然还需要\0将输出翻译回\n

这是您的命令,假设file1包含您要搜索的模式file2

grep -aof <(tr '\n' '\0' < file1) <(tr '\n' '\0' < file2) | tr '\0' '\n'
Run Code Online (Sandbox Code Playgroud)

给定文件的示例输出:

A B
C D
E F
G H
Run Code Online (Sandbox Code Playgroud)

解释:

  • <(tr '\n' '\0' < file1)创建一个 FIFO/命名管道/临时文件类对象,该对象等于file1,但所有换行符都转换为 NUL 字符。
  • <(tr '\n' '\0' < file2)做同样的事情,但对于file2.
  • grep -f PATTERN_FILE INPUT_FILEPATTERN_FILEin 中搜索模式INPUT_FILE
  • 启用二进制文件匹配的-a标志grep。这是必需的,否则它会跳过包含不可打印字符的文件,如\0.
  • -ogrep使它只打印匹配的序列,而不是整个行,其中已经发现。
  • | tr '\0' '\n' 将左侧命令输出中的所有 NUL 字符转换回换行符。


Mic*_*hrs 6

以下是笨拙的,但适用于 GNU awk

awk -v RS="$(<file1)" '{print RT}' file2
Run Code Online (Sandbox Code Playgroud)