2017-10-12 41 views
2

我想提取所有行之前和之后我发现“ACCCC”,直到空行前获取所有的线路和模式匹配之后,直到有空白行

下面是一个简单的数据

ABCDEFG 

ABASLDKJ 
ASDASKKK 
ASDASDAS 
ACCCC 
ASDASDAS 
ASDASDAS 

ASDASDAA 

我尝试使用的sed

sed -n '/ACCC/,/^$/p' test 
#ACCCC 
#ASDASDAS 
#ASDASDAS 

但是使用这个我不明白上面的行。

我知道我可以使用grep的-A -B但在此之前和模式之后的行数可能会在我的原始数据改变

我需要提取

ABASLDKJ 
ASDASKKK 
ASDASDAS 
ACCCC 
ASDASDAS 
ASDASDAS 

回答

2

使用awk的段落模式(一个或多个空行作为记录分隔符)

$ awk -v RS= '/ACCCC/' ip.txt 
ABASLDKJ 
ASDASKKK 
ASDASDAS 
ACCCC 
ASDASDAS 
ASDASDAS 
  • -v命令行选项有助于值设置为变量
  • RS是输入记录分隔符,其默认值为换行符

awk manual

通过一个特殊的分配,一个空字符串作为RS 的值指示记录由一个或多个空行分隔。当 RS设置为空字符串时,每条记录总是以遇到的第一条空行 结束。下一条记录不会开始,直到下面的第一条非空白行 。无论在行中出现多少空白行,它们都充当一个记录分隔符。 (空行,必须是 完全是空的;只包含空格不计行。)

+1

谢谢!有用。你能简单地解释一下-v和RS代表 – HeMan

0

这可能为你工作(GNU SED):

sed '/\S/H;//d;x;/^\n.*ACCC/s/.//p;x;h;d' file 

如果当前行包含非空格字符,将其附加到保存空间(HS),然后将其删除。否则,交换到HS并检查其内容是否包含以空行开始的所需字符串,如果是,则删除空行并打印剩余内容。在所有情况下,用当前行替换HS,然后删除它。

+0

谢谢你一个很好的答案!虽然我没有足够的RP。起来。 – HeMan