2016-06-21 99 views
1

我想打印两个空行之间的行后才进行匹配。我的数据是这样的:在匹配模式后打印段落

List A 
Item 1 
Item 2 
Item 3 

Item 4 
Item 5 

List B 
Item 1 
Item 2 
Item 3 

因此,我试图让一个awk或者sed或grep命令到目前为止匹配列表A和得到的

Item 4 
Item 5 

输出,我曾尝试这样做的:

sed '/^$/,/^$/!d' 

sed '/list\sA.*^$/,/^$/!d' 

在这种情况下,我试图打印范围并将第一个模式定义为字符串,并将所有内容都包含在空行中。

我也尝试过其他代码:

awk -v RS='' -v ORS='\n\n' 

但是,这只是给了我一个包含模式的段落,我试图让之后的段落。

最后,我认为这是使用sed -n的东西,并且使用带有标签的{},但我没有足够先进的把它放在一起。如果你能指出我正确的方向,我会非常感激。

+0

所以你正在做的比赛是一个包含“A”的段落? – fedorqui

+0

不完全是,我想匹配“列表A”并打印后面的段落:Item 4 Item 5 – DomainsFeatured

回答

4

当你匹配一个模式,与getline取得下一条记录:

$ awk -v RS='' '/List A/ {getline; print}' file 
Item 4 
Item 5 
+0

这很好用。我不得不添加一些东西来确保格式很好,但这是正确的代码。谢谢您的帮助! – DomainsFeatured

+0

对此进行快速跟进。如果我想从文件中删除这两行,是否有一种使用类似awk命令的简单方法? – DomainsFeatured

+1

@DomainsFeatured你想检查[awk修改](http://stackoverflow.com/a/16529730/1983854)。 – fedorqui

0

我会建议使用awk这里作为fedorqui的答案中。但是,下面的命令sed将工作,以及:

sed -n '/List A/{:a;n;/^$/!ba;:b;n;/^$/!{p;bb}}' file 

说明:

/List A/ { 
    :a   # Label "a" 
    n   # Get new line from input 
    /^$/! ba # If this line is not empty jump back to :a 
    :b   # Label "b" 
    n   # Get new line from input 
    /^$/! {  # If this line is not empty: 
     p  # Print the line 
     bb  # Jump back to :b 
    } 
} 

选项-n除非使用p抑制线的打印。