我搜索了一下,但没有找到针对这种特定情况的解决方案。给定一个管道输出任意数量的非空行分隔单个空行的组,是否有一个sed单行(或awk单行或perl单行)将非空行组合成单行,同时保留空白行?例如,输入
one
two
three
four
five
six
seven
eight
应输出为
one two
three four five
six
seven eight
提前感谢所有回复的人。
答案 0 :(得分:4)
这可能适合你(GNU sed):
validate()
如果该行不为空,请阅读以下行,如果该行不为空,则用空格替换换行并重复,否则打印图案空间。如果第一行中的行是空的,则打印空行:这适用于空的第一行,如果不是这样的话,那么非空行之间只有一个空行:
sed '/./{:a;N;s/\n\(.\)/ \1/;ta}' file
就足够了。
答案 1 :(得分:3)
Perl one-liner
perl -00 -lpe 'tr/\n/ /'
,其中
-00
以空白行分隔的段落-l
会自动处理行尾换行符-p
会在处理后自动打印每条记录tr/\n/ /'
将所有换行更改为空格答案 2 :(得分:3)
修改样本输入以包含多个连续的空行
$ cat ip.txt
one
two
three
four
five
six
seven
eight
awk
解决方案:
$ awk -v RS= -v ORS="\n\n" '{gsub("\n"," "); print}' ip.txt one two three four five six seven eight
还要保留多个空格:
$ perl -0777 -pe 's/[^\n]\K\n(?=^[^\n])/ /mgs' ip.txt
one two
three four five
six
seven eight
-0777
将整个文件作为一个字符串,因此如果输入文件大到不适合内存,则不适合答案 3 :(得分:3)
awk
解决方案:如果您不希望输出中有空白行,则将RS设置为空白行并将ORS设置为两个新行,只需从下方命令进行远程ORS。
awk -v RS= -v ORS="\n\n" '{$1=$1}1' foo.in
one two
three four five
six
seven eight