首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给定分隔行的文本块,如何返回包含特定关键字的每个块?

给定分隔行的文本块,如何返回包含特定关键字的每个块?
EN

Stack Overflow用户
提问于 2015-11-30 22:27:11
回答 1查看 79关注 0票数 1
代码语言:javascript
复制
me$ cat file.txt

Filename: 1
Organization: Bus 1 => Port 1 => Subport 1 => Device 3
Classes: Interface Video
Drivers: usbhid

Filename: 2
Organization: Bus 1 => Port 1 => Subport 3 => Device 4
Classes: Audio 
Drivers: usb-audio uvc Video

Filename: 3
Organization: Bus 1 => Port 1 => Subport 4 => Device 5
Classes: Wireless Video
Drivers: uvc  

我如何操作它来返回包含任何给定关键字的块?

例如: bash这个级别的“视频”将返回:

代码语言:javascript
复制
Filename: 1
Organization: Bus 1 => Port 1 => Subport 1 => Device 3
Classes: Interface Video
Drivers: usbhid

Filename: 3
Organization: Bus 1 => Port 1 => Subport 4 => Device 5
Classes: Wireless Video
Drivers: uvc  

编写脚本来对-类和-驱动程序的情况进行排序将是非常简单的,只是询问具体的文本操作。我正在按照grep类的思路思考:*$input,取行号,并从换行符到下一条换行符打印所有内容,但是这会带来更多的复杂性,而且可能不是最有效的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-30 22:38:02

要获得Classes...Video:

代码语言:javascript
复制
$ awk -v RS= '/Classes:[^\n]*Video/' file.txt
Filename: 1
Organization: Bus 1 => Port 1 => Subport 1 => Device 3
Classes: Interface Video
Drivers: usbhid
Filename: 3
Organization: Bus 1 => Port 1 => Subport 4 => Device 5
Classes: Wireless Video
Drivers: uvc  

(我用mawk和GNU测试了它,它应该适用于任何POSIX awk (帽子提示: ninjalj),但它可能与awk的很老的版本不兼容。)

它是如何工作的

  • -v RS= 这将记录分隔符设置为空字符串,该字符串通常被解释为含义段落。
  • /Classes:[^\n]*Video/ 如果记录(段落)包含Classes:,则返回true,后面跟着除换行符以外的任意数量的字符,后面跟着Video。换句话说,如果一行包含字符串Classes:,然后包含字符串Video,则返回true。如果此条件返回true,则awk执行默认操作,即打印记录(段落)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34009199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档