使用Unix,当检测一个模式时,我们需要检测它对应的其他模式

使用Unix,当检测一个模式时,我们需要检测它对应的其他模式

当检测到包含图案的线时夜晚,我们需要检测其对应的包含其他模式的行===这只是发生在较高的线上,如下所示。

  • 文件内容:

=== 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交换当前模式字符串和当前缓冲区字符串的位置。

相关内容