当检测到包含图案的线时夜晚,我们需要检测其对应的包含其他模式的行===这只是发生在较高的线上,如下所示。
- 文件内容:
=== 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
交换当前模式字符串和当前缓冲区字符串的位置。