【问题标题】:Obtain all the lines before and after a pattern match until a there is blank line获取模式匹配前后的所有行,直到有空行
【发布时间】:2018-03-24 04:13:44
【问题描述】:

我想提取找到“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

【问题讨论】:

    标签: awk sed grep


    【解决方案1】:

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

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

    来自awk manual

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

    【讨论】:

    • 谢谢!有用。你能简单解释一下 -v 和 RS 代表什么
    【解决方案2】:

    这可能对你有用(GNU sed):

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

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

    【讨论】:

    • 感谢您的精彩回答!虽然我没有足够的rp。向上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2015-10-30
    相关资源
    最近更新 更多