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