![使用Unix,当检测一个模式时,我们需要检测它对应的其他模式](https://linux22.com/image/64648/%E4%BD%BF%E7%94%A8Unix%EF%BC%8C%E5%BD%93%E6%A3%80%E6%B5%8B%E4%B8%80%E4%B8%AA%E6%A8%A1%E5%BC%8F%E6%97%B6%EF%BC%8C%E6%88%91%E4%BB%AC%E9%9C%80%E8%A6%81%E6%A3%80%E6%B5%8B%E5%AE%83%E5%AF%B9%E5%BA%94%E7%9A%84%E5%85%B6%E4%BB%96%E6%A8%A1%E5%BC%8F.png)
当检测到包含图案的线时夜晚,我们需要检测其对应的包含其他模式的行===这只是发生在较高的线上,如下所示。
- 文件内容:
=== test1.log
boo
bar
游戏
=== file23.txt
夜78
远的
夜晚
文本
=== log3.c
AAA
限制
晚上3
- 输出:
=== file23.txt
夜78
夜晚
=== log3.c
晚上3
答案1
你可以使用 awk 来完成,如下所示:
awk '/===/ {SEC=$0;PRINTED=0} /night/ {if(!PRINTED) print SEC; print $0; PRINTED=1;}' <file>
它将查找该===
行并将其存储,并注意它尚未打印该行。然后,如果它找到该模式,night
它将检查是否已经打印了节标题,如果没有,则打印它,然后打印当前行并标记它已经打印了节标题。
答案2
用 sed 尝试过这个
sed -n '/===/{
h
d
}
/night/{
G
s/\(.*\)\n\(.*\)/\2\
\1/p
}' inputFile
这并不完全是您想要的,但非常相似。
=== file23.txt
night78
=== file23.txt
night
=== log3.c
night3
/==
将当前模式保存在缓冲区中/night
匹配所有包含 token night 的行G
将当前缓冲区附加到当前模式空间。/s
交换当前模式字符串和当前缓冲区字符串的位置。