我有一个包含内容的文件:
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
请注意,空行分隔了行块,并且每个块中的新行都被空格替换。
我的解决方案非常难看,我首先用分隔符替换空行,例如“|”,然后按空格替换所有换行符,最后替换分隔符“|”通过换行符。有没有人更优雅地解决这个问题?
答案 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