sac*_*hin 9 sed awk shell-script text-processing
我有两个文件,file1和file2.
样本内容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_FILE从PATTERN_FILEin 中搜索模式INPUT_FILE。-a标志grep。这是必需的,否则它会跳过包含不可打印字符的文件,如\0.-o旗grep使它只打印匹配的序列,而不是整个行,其中已经发现。| tr '\0' '\n' 将左侧命令输出中的所有 NUL 字符转换回换行符。以下是笨拙的,但适用于 GNU awk:
awk -v RS="$(<file1)" '{print RT}' file2
Run Code Online (Sandbox Code Playgroud)