sed - sed 用于查找和打印多行块
问题描述
我的输入包含几个简单的多行块。块中的所有行都匹配某个模式,只有最后一行匹配不同的模式:
some junk
a1
some other junk
a2
a3
a4
B
some more junk
a5
我想打印所有匹配的块(并禁止所有其他行):
a2
a3
a4
B
我的想法是使用 Hold Buffersed
来实现这一点:
sed -e '/a./H;/B/{H;x;p};d'
这几乎可以工作,因为它还打印没有必要的结束行的块:
a1
a2
a3
a4
B
我的想法是在两种模式都不匹配时清理保持缓冲区,但我找到了实现这一目标的方法。也许我的理解sed
太有限,看不到明显的方法。
解决方案
这可能对您有用(GNU sed):
sed -n '/a./!{:a;n;/\S/ba;b};h;:b;n;H;/a./bb;/\S/!b;/B/!ba;n;H;/\S/ba;x;p' file
-n
使用该选项关闭隐式打印。
如果一组行不是以所需的正则表达式开头,则丢弃这些行。
否则,在保留空间中收集这些行,直到正则表达式失败,然后如果下一行包含第二个正则表达式并且后面的行为空,则将这两行附加到保留空间,交换到保留空间并打印该组的行。重复。
对于所有其他情况,不要打印任何行。
注意这取决于最后一行是空的。
推荐阅读
- terraform - 将环境变量列表传递给资源
- php - 由于错误无法加载新页面
- ruby-on-rails - 如何在 ruby docker-api 中将图像作为守护进程运行?
- docker - 使用 docker start 命令时强制容器保持活动状态
- google-apps-script - 如何将特定列的数据从一张表复制到另一张表
- bash - 查找:路径必须在表达式之前:2
- mysql - 为什么我的 `delete where id in` 语句会删除表中的所有记录?
- django - 有没有办法从包含相同外键的表中获取数据?
- debugging - 调试器设备无法通过 CAN 连接到目标
- java - 使用绑定的前台服务保持音频播放