gsed 合并非空行

先看样本:

闻道双衔凤带,
不妨单著鲛绡。
夜香知与阿谁烧。
怅望水沈烟袅。
云鬓风前绿卷,
玉颜醉里红潮。
莫教空度可怜宵。
月与佳人共僚。

微风和暖日鲜明,
草色迷人向渭城。
吴客卷帘闲不语,
楚娥攀树独含情。
红垂果蒂樱桃重,
黄染花丛蝶粉轻。
自恨青楼无近信,
不将心事许卿卿。

关山魂梦长,
鱼雁音尘少。
两鬓可怜青,
只为相思老。
归梦碧纱窗,
说与人人道。
真个别离难,
不似相逢好。

想合并得到下面的结果:

闻道双衔凤带,不妨单著鲛绡。夜香知与阿谁烧。怅望水沈烟袅。云鬓风前绿卷,玉颜醉里红潮。莫教空度可怜宵。月与佳人共僚。

微风和暖日鲜明,草色迷人向渭城。吴客卷帘闲不语,楚娥攀树独含情。红垂果蒂樱桃重,黄染花丛蝶粉轻。自恨青楼无近信,不将心事许卿卿。

关山魂梦长,鱼雁音尘少。两鬓可怜青,只为相思老。归梦碧纱窗,说与人人道。真个别离难,不似相逢好。

第一种方法:

gsed ':a N; /\n$/!s/\n//; ta' temp

> /\n$/ - 对应模式空间里的最后一个换行符
> /.../!  - 表示模式空间里满足改正则模式的内容不执行之后的命令
> ta     - 前面的命令执行结果为真时,跳回a  
> 这里解释一下sed的执行过程,比如:
  读入第一行,N读取下一行,现在模式空间的内容为:
  第一行\n第二行,不满足 /\n$/,执行替换,得到:第一行第二行
  N,读取下一行,模式空间为:
  第一行第二行\n第三行,不满足

第二种方法:

gsed '/./{:a;N;s/\n\(.\)/ \1/;ta}' temp

第三种方法:

gsed -n 'H; /^\n/h; /^$/x; s/\n\(.\)/\1/gp; ${x; s/\n//gp}'

转自:

  1. https://stackoverflow.com/questions/39734125/sed-to-combine-n-text-lines-separated-by-blank-lines
  2. https://stackoverflow.com/questions/43280650/how-can-join-consecutive-non-empty-lines-using-sed-awk

你可能感兴趣的:(gsed 合并非空行)