我想在找到“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
答案 0 :(得分:2)
使用awk的段落模式(一个或多个空行充当记录分隔符)
$ awk -v RS= '/ACCCC/' ip.txt
ABASLDKJ
ASDASKKK
ASDASDAS
ACCCC
ASDASDAS
ASDASDAS
-v
命令行选项有助于将值设置为变量RS
是输入记录分隔符,其默认值为换行符通过特殊分配,空字符串作为RS的值 表示记录由一个或多个空行分隔。什么时候 RS设置为空字符串,每个记录总是在第一个结束 遇到空行。下一条记录直到第一条记录才开始 随后是非空白线。无论出现多少空白行 行,它们都充当一个记录分隔符。 (空行必须是 完全空虚;仅包含空格的行不计算在内。)
答案 1 :(得分:1)
这可能适合你(GNU sed):
sed '/\S/H;//d;x;/^\n.*ACCC/s/.//p;x;h;d' file
如果当前行包含非空格字符,请将其附加到保留空间(HS),然后将其删除。否则,交换到HS并检查其内容是否包含以空行开头的所需字符串,如果是,则删除空行并打印剩余内容。在所有情况下,用当前行替换HS,然后将其删除。