获取模式匹配之前和之后的所有行,直到有空行

时间:2017-10-12 09:24:38

标签: awk sed grep

我想在找到“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 个答案:

答案 0 :(得分:2)

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

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

来自awk manual

  

通过特殊分配,空字符串作为RS的值   表示记录由一个或多个空行分隔。什么时候   RS设置为空字符串,每个记录总是在第一个结束   遇到空行。下一条记录直到第一条记录才开始   随后是非空白线。无论出现多少空白行   行,它们都充当一个记录分隔符。 (空行必须是   完全空虚;仅包含空格的行不计算在内。)

答案 1 :(得分:1)

这可能适合你(GNU sed):

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

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