使用sed删除范围中的换行符

时间:2013-12-02 22:11:15

标签: sed


我该如何做到这一点:

    TextTextText
    start
    stuff
    stuff
    stuff
    end
    start
    stuff
    end
    TextTextText

看起来像这样:

    startstuffstuffstuffend
    startstuffend
用sed? 我试过这个:

    sed -e '/start/,/end/N; s/\n//'

但它做到了这一点:

    startstuff
    stuffstuff
    endstart
    stuff
    end

这只是每一行......

4 个答案:

答案 0 :(得分:4)

您可以尝试以下命令:

sed -n '/start/,/end/ H; $ { g; s/\n//g; s/\(end\)/\1\n/g; p }' infile

它避免了自动打印(-n),保留了保留缓冲区(start)范围endH之间的所有行,并且当整个文件有已处理完毕($),首先删除所有换行符,然后在每个end字后添加一个。

它产生:

startstuffstuffstuffend
startstuffend

答案 1 :(得分:0)

您可以使用awk

awk '/start/ {f=1} f {printf $1} /end/ {f=0;print ""}' file
startstuffstuffstuffend
startstuffend

或者你可以做到

awk '/start/,/end/ {printf $1;if ($0~/end/) print ""}' file
startstuffstuffstuffend
startstuffend

答案 2 :(得分:0)

sed '/start/
   {
: again
   N
   s/End$/&/
   t clean
   b again
: clean
   s/\n//g
   }
' file

如果没有“结束”但只有一个开头也可以连接,但也许你不想要这个(问题也出现在其他答案中)

答案 3 :(得分:0)

sed -n '/start/{h;:l n;H;/^end$/!bl;x;s/\n//g;p}' input