连接由空行分隔的组

时间:2014-09-27 05:38:47

标签: linux shell sed

我有一个包含内容的文件:

aaa bbb ccc
jjj kkkk llll qqqq
www ee rrrr

kkkk oooo ppp wwww
kk aaa dd

aa eee tttt

我想得到以下输出:

aaa bbb ccc jjj kkk llll qqqq www ee rrrr
kkkk oooo ppp wwww kk aaa dd
aa eee tttt

请注意,空行分隔了行块,并且每个块中的新行都被空格替换。

我的解决方案非常难看,我首先用分隔符替换空行,例如“|”,然后按空格替换所有换行符,最后替换分隔符“|”通过换行符。有没有人更优雅地解决这个问题?

4 个答案:

答案 0 :(得分:3)

可以使用awk轻松完成:

awk -v RS= '{gsub(/\n/, " "); print}' file
aaa bbb ccc jjj kkkk llll qqqq www ee rrrr
kkkk oooo ppp wwww kk aaa dd
aa eee tttt

此处-v RS=将记录分隔符设置为空字符串,使awk读取多行(直到出现空行)作为单个记录。

更新:更简单的awk可以是:( 感谢@jaypal

awk -v RS= '{$1=$1}1' file

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed ':a;N;/\n./s/\n/ /;ta;P;d' file

答案 2 :(得分:1)

您也可以使用此sed命令

sed ':a ;N;/\n$/{P;d;t} ; s/\n/ /g ; t a' File_name 

说明:

N           - Getting two lines 
s/\n/ /g    - replace newline to space 
: a and ta  - Execute the loop and append each and every line .
              (So every line become a single line ).
/\n$/       - matching end with new line then break the loop and and start from the first .
{P,d,t}     - print the pattern space First line and delete the pattern space and start 
              the loop  

答案 3 :(得分:0)

通过perl,

perl -i -00pe 's/(?<!\n)\n(?!\n)/ /g; s/\n\n/\n/g' file