在一行中搜索字符串并附加相关行

在一行中搜索字符串并附加相关行

ID我有一个包含一些(标识符)和DS(描述)行的文件。我想保留string在其ID行中包含该值的行,以及DS以下ID.举个例子:

ID  number1 string
DS  item11
DS  item12
ID  number2 not_string
DS  item21 
DS  item22
ID  number3 string
DS  item31
DS  item32

将返回:

ID  number1 string
DS  item11
DS  item12
ID  number3 string
DS  item31
DS  item32

答案1

如果我理解正确,我会更改not_string您的输入以进行测试:

ID  number1 string                                                              
DS  item11                                                                      
DS  item12                                                                      
ID  number2 qwerty                                                               
DS  item21                                                                      
DS  item22                                                                      
ID  number3 string                                                              
DS  item31                                                                      
DS  item32

尝试:

$ awk '/ID/ && !/string/{flag=0;next};/string/{flag=1};flag' file 
ID  number1 string
DS  item11
DS  item12
ID  number3 string
DS  item31
DS  item32

答案2

sed -n '/ID.* s/p;//,/ID/{//!p;}' <<\DATA                              
    ID  number1 string
    DS  item11
    DS  item12
    ID  number2 not_string
    DS  item21
    DS  item22
    ID  number3 string
    DS  item31
    DS  item32
DATA

就靠这个POSIX 定义正则表达式地址的行为sed

如果 RE 为空(即没有指定模式) sed应表现得如同应用了最后一个命令中使用的最后一个 RE(作为命令/address/或命令的一部分s/ubsti/tute/被指定。

当搜索的顶部与/ID.* s/地址匹配时,就会 p打印出来。行范围在与最后一个地址//,/ID/和下一个地址匹配的行之间指定ID线。任何落在{within;}该范围内的线(如果以最后一行结尾则为不完整)!not匹配的//也被p打印。

所有出现的都是/ID.* s/我明确p打印的行和所有发生的行之间该行和下一个出现的/ID/行 - 或(并包括)最后一行,以先到者为准。

输出

ID  number1 string
DS  item11
DS  item12
ID  number3 string
DS  item31
DS  item32

相关内容