代码之家  ›  专栏  ›  技术社区  ›  dan

如何让SED打印一系列行,直到它看到两个连续的空白行?

sed
  •  5
  • dan  · 技术社区  · 15 年前

    我想用这样的SED脚本

    #n
    /^TODO/,/^$/p
    

    除了SED应该在遇到两个连续的空白行后停止打印范围,而不是只打印一个空白行。然后它应该继续扫描下一个感兴趣的范围。换句话说,兴趣范围的结尾由两个空行定义。我甚至不确定地址范围是否可以处理这种需求,所以如果有其他方法可以做到这一点,请告诉我。

    5 回复  |  直到 11 年前
        1
  •  6
  •   Dennis Williamson    15 年前

    当遇到非空行的空行奇数/偶数配对时,这应该停止,当它遇到两条连续的空行时:

    不要打印这两个空行:

    sed -n 'N;/^\n$/q;P;D'
    

    打印其中一个:

    sed -n 'N;/^\n$/{P;q};P;D'
    

    打印两个:

    sed -n 'N;/^\n$/{p;q};P;D'
    

    编辑:

    以下是您如何在您的范围内实现这一目标:

    sed -n '/^TODO/,${N;/^\n$/q;P;D}'
    

    编辑2:

    丹的 (OP)注释和编辑的需求,这似乎可以在一个范围内找到以两行空白结束的模式,在一个文件中多次:

    sed -n '/^TODO/,/^$/{H;N;/^\n$/{b};p}'
    
        2
  •  1
  •   ghostdog74    15 年前

    使用SED进行简单替换。

    $ more file
    1
    2
    blah blah
    TODO
    blah blah
    4
    5
    
    
    6
    7
    8
    9
    10
    
    
    11
    end
    $ awk -vRS="\n\n" '/TODO/{print;exit}' file
    1
    2
    blah blah
    TODO
    blah blah
    4
    5
    
        3
  •  0
  •   Tobu    15 年前

    基于西格克斯的答案:

    cat > lines <<'EOF'
    a
    
    
    c
    d
    EOF
    sed '/^$/N; /^\n$/q' lines
    
        4
  •  0
  •   SiegeX    15 年前
    sed 'N;/^\n$/q;P;D'
    

    概念证明

    $ cat double_blank.txt
    foo
    bar
    
    baz
    
    
    blah
    one
    two
    
    three
    
    

    结果

    $ sed 'N;/^\n$/q;P;D' double_blank.txt
    foo
    bar
    
    baz
    
    
    
        5
  •  0
  •   potong    11 年前

    这可能对您有用:

    sed '/^TODO/!d;:a;$!{N;s/\n$//;t;ba}' file